####

Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 (CC BY-NC 3.0) United States License.

To cite this case study please use:

Wright, Carrie, and Ontiveros, Michael and Jager, Leah and Taub, Margaret and Hicks, Stephanie. (2020). https://github.com/opencasestudies/ocs-youth-school-shootings-dashboard-case-study. Fifty Years of School Shootings in the United States (Version v1.0.0).

Motivation


This case study is motivated by this article:

Flannery, D. J., Modzeleski, W. & Kretschmar, J. M. Violence and School Shootings. Curr Psychiatry Rep 15, 331 (2013). DOI: 10.1007/s11920-012-0331-6

This article explores characteristics of school shootings and violence in schools and discusses why these events may occur, as well as their impact on the communities in which they occur.

This article states that the shooters of most commonly white males, but that many previous studies of shooter characterisitcs could not identify any particular “profile” of shooters.

“To date, studies of school shootings have concluded that no consistent and reliable profile of school shooters exist, and most researchers and clinicians would agree that predicting violent behavior is a slippery slope that will usually result in more false positives than false negatives.”

However previous studies note some commonalites such as:

“…most shooters were depressed, had experienced some significant loss, felt persecuted or bullied by others, and had prior difficulty coping or had previously tried suicide. Most of the shooters did not, however, have a history of drug abuse or violence or cruelty to animals, common psychiatric indicators of risk, nor did they report excessive exposure to violence in the media (though many produced their own violent themes in writings or drawings).”

Photo by Joshua Hoehne on Unsplash

“School shootings are not all the same and may require different approaches to prevention and treatment, especially with respect to identifying risk factors at the individual, school or community levels, and particularly with regard to examining the role that mental health issues may play to increase risk for perpetration. The field needs to know more about shooting incidents that are averted, those that result in injury but not death and about the characteristics of the more common occurrence of single homicide school shootings.”

Photo by Andre Hunter on Unsplash

They also point out that:

“Most media attention is on the mental health of school shooters, but we cannot forget the impact of school shooting incidents on the surviving victims, including those who may not have been injured but who may have witnessed the incident or been affected by it in other ways. Psychiatrists must pay attention to the long-term mental health consequences of these incidents on all affected parties (not just formal PTSD diagnoses, but related trauma symptoms) as well as maladaptive coping strategies that some may employ in response to such unpredictable, tragic events.”

Given this need for more research to better understand why these events occur and how they could be averted, in this case study we will demonstrate how to create a resource for others to more easily and interactively access data about school shootings. To do so we will create what is called a dashboard, which is a website that displays a report for a database. Dashboards summarize the data in a database and typically allow for users to interact with the data in some way.

Here you can see an example of a dashboard created in R.

On the website the tabs and and plots are interactive. The dashboard allows for users to get to know the data in a simple and quick way.

The data about food sales is succinctly summarized in an impactful manner.

####[source]

Now let’s learn how to do this with our data of interest.

Main Questions


Our main questions:

  1. What has been the yearly rate of school shootings and where have they occurred in the last 50 years (from January 1970 to June 2020)?

  2. What are the characteristics of these events?

Learning Objectives


In this case study, we will demonstrate how to create a dashboard, which is a website that displays a report about a database. We will especially focus on using packages and functions from the Tidyverse, such as package_name, package_name. The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R more legible and intuitive.

The skills, methods, and concepts that students will be familiar with by the end of this case study are:

Avocado update here and in readme!

Data science skills:

  1. Importing text from a google sheets document???
  2. Apply action verbs in dplyr for data wrangling
  3. How to reshape data by pivoting between “long” and “wide” formats and separating columns into additional columns (tidyr)
  4. How to fill in data based on previous values (tidyr)
  5. How to create data visualizations with ggplot2 that are in a similar style to an existing image
  6. How to add images to plots using cowplot
  7. How to create effective bar plots to for multiple comparisons, including adding gaps between bars in bar plots, adding figure legends to the plot area, and adding comparison lines (ggplot2)

Statistical concepts and methods:


We will begin by loading the packages that we will need:

Packages used in this case study:

Package Use in this case study
here to easily load and save data
readr to import the data
dplyr to filter, subset, join, add rows to, and modify the data
stringr to manipulate character strings within the data
magrittr to pipe sequential commands
ggmap to geocode the data (which means get the latitude and longitude values for the schools)
waffle to make waffle proportion plot
flexdashboard to create the elements of the dashboard

tidyr | to change the shape or format of tibbles to wide and long, to drop rows with NA values, to separate a column into additional columns, and to fill out values based on previous values
shiny | to allow our dashboard to be interactive
leaflet | to implement the leaflet (a JavaScript library for maps) to create the map for our dashboard
sf | to Geocode the data avocado rmapshapper | avocado htmltools | to avocado
lubridate | to work with the data-time data
DT | to create the interactive table
ggplot2 | to create plots
directlabels | to add labels directly to lines in plots
cowplot | to add images to plots forcats | to reorder factor for plot

patchwork | to combine plots

The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.

Context


Although school shooting events that result in homicide are rare, they can have a lasting impact on the communities in which they occur. Furthermore, suicide events and shootings with no victims can also be impactful.

According to the Center for Injury Research and Prevention at the Children’s Hospital of Philadelphia:

The most common shootings on school grounds rarely involve large numbers of victims, but even a shooting of just one student at school has ramifications far beyond those directly involved. Students and staff that witness school shootings are likely to suffer from traumatic stress symptoms, become anxious or depressed and have general concerns about their safety. While many witnesses will have temporary symptoms, others will be symptomatic for a much longer period of time and even develop chronic psychiatric disorders. Even short-term impairments can cause severe distress and have profound effects on academic achievement and the social and emotional growth of impacted students.

Furthermore, fatal shootings can have vast and lasting impacts because many students can witness a single event.

Another recently published article indicates that:

Over 240,000 American students experienced a school shooting in the last two decades.

[source]

This study followed students who experienced a school shootting the United States between 2008 and 2013 and assessed their mental well-being. They found that:

Fatal school shootings have large and persistent impacts on the mental health of local youth. In the two years following a fatal school shooting, the monthly number of antidepressant prescriptions written to individuals under age 20 is 21.3 percent higher in the shooting-exposed relative to the reference areas.

Photo by Fernando @cferdo on Unsplash

Rossin-Slater, M., Schnell, M., Schwandt, H., Trejo, S. & Uniat, L. Local Exposure to School Shootings and Youth Antidepressant Use. w26563 http://www.nber.org/papers/w26563.pdf (2019) doi:10.3386/w26563.

Limitations


There are some important considerations regarding this data analysis to keep in mind:

  1. This analysis is exploratory and, as such, does not intend to provide inferential conlcusions.

  2. This dashboard only uses one source of data. There may be school shooting events that are not listed in this data or errors in this data.

According to the database website:

“This database was developed from open-source information and may include reporting errors.”

Furthermore, according to this article schools are not required to report school shootings unless they resulted in a suicide or homicide, therefore there may be more events that result in only injury or no injuries or death that may not be included.

There are indeed events in the dataset that include zero deaths and zero injuries, but it is very likely that many of these events are not listed.

Avocado… this source from 2013 says that schools are not required to report.. is this still true?

What are the data?


We will use data from the open-source K-12 Shool Shooting Database downloaded from the Center for Homeland Defense and Security at the at the Naval Postgraduate School(NPS) in Monterey, California. This data is updated daily. The data used in this case study was downloaded in June of 2020.

Riedman, David, and Desmond O’Neill. “CHDS – K-12 School Shooting Database.” Center for Homeland Defense and Security, June 2020, www.chds.us/ssdb.

This database includes information about school shooting events for students in grades K-12 in the United States dating back to 1970. The database has additional information not shown on our dashboard including but not limited to:

  • Location of the event at the school
  • If the event occured during a sporting event
  • Time of day of the event
  • Day of the week of the event
  • Source for the shooting information
  • If the event was pre-planned or not
  • Shooter’s actions immediately following the shooting
  • Shooter characteristics (affiliation with the school, if they had accomplices, if they took hostages, and their age and race)
  • Victom characteristics (afficliation with the school, if they were targeted, their age and race)

According to the K-12 Shool Shooting Database website:

The School Shooting Database Project is conducted as part of the Advanced Thinking in Homeland Security (HSx) program at the Naval Postgraduate School’s [Center for Homeland Defense and Security (CHDS)](Center for Homeland Defense and Security (CHDS).

The database compiles information from more than 25 different sources including peer-reviewed studies, government reports, mainstream media, non-profits, private websites, blogs, and crowd-sourced lists that have been analyzed, filtered, deconflicted, and cross-referenced. All of the information is based on open-source information and 3rd party reporting.

Data Import


To import the raw data file we will use the read_csv() function of the readr package.

We will use the here() function of the here package to easily locate the data within the raw_data directory within the directory that contains the .Rproj file.

We want to skip the first row that states: Updated 6/2/2020 - View graphs and research methodology on www.chds.us/ssdb If you have information about other incidents, please email ."

To do this, we can use the skip argument of this function and specify that we wish to only skip 1 row with skip = 1. We can also specify that the next row should be used for column names using the col_names = TRUE argument.

We can use the glimpse function of the dplyr package to take a look at columns within the database:

Rows: 1,556
Columns: 47
$ Date                                                                                                                                                 <chr> …
$ School                                                                                                                                               <chr> …
$ City                                                                                                                                                 <chr> …
$ State                                                                                                                                                <chr> …
$ `Reliability Score (1-5)`                                                                                                                            <dbl> …
$ `Killed (includes shooter)`                                                                                                                          <dbl> …
$ Wounded                                                                                                                                              <dbl> …
$ `Total Injured/Killed Victims`                                                                                                                       <dbl> …
$ `Gender of Victims (M/F/Both)`                                                                                                                       <chr> …
$ `Victim's Affiliation w/ School`                                                                                                                     <chr> …
$ `Victim's age(s)`                                                                                                                                    <dbl> …
$ `Victims Race`                                                                                                                                       <chr> …
$ `Victim Ethnicity`                                                                                                                                   <chr> …
$ `Targeted Specific Victim(s)`                                                                                                                        <chr> …
$ `Random Victims`                                                                                                                                     <chr> …
$ `Bullied (Y/N/ N/A)`                                                                                                                                 <chr> …
$ `Domestic Violence (Y/N)`                                                                                                                            <chr> …
$ `Suicide (Shooter was only victim) Y/N/ N/A`                                                                                                         <chr> …
$ `Suicide (shot self immediately following initial shootings) Y/N/ N/A`                                                                               <chr> …
$ `Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A` <chr> …
$ `Suicide (or attempted suicide) by Shooter (Y/N)`                                                                                                    <chr> …
$ `Shooter's actions immediately after shots fired`                                                                                                    <chr> …
$ `Pre-planned school attack`                                                                                                                          <chr> …
$ Summary                                                                                                                                              <chr> …
$ Category                                                                                                                                             <chr> …
$ `School Type`                                                                                                                                        <chr> …
$ `Narrative (Detailed Summary/ Background)`                                                                                                           <chr> …
$ Sources                                                                                                                                              <chr> …
$ `Time of Occurrence (12 hour AM/PM)`                                                                                                                 <time> …
$ `Duration (minutes)`                                                                                                                                 <dbl> …
$ `Day of week (formula)`                                                                                                                              <chr> …
$ `During School Day (Y/N)`                                                                                                                            <chr> …
$ `Time Period`                                                                                                                                        <chr> …
$ `During a Sporting Event (Y/N)`                                                                                                                      <chr> …
$ `During a school sponsored event (school dance, concert, play, activity)`                                                                            <chr> …
$ Location                                                                                                                                             <chr> …
$ `Number of Shots Fired`                                                                                                                              <dbl> …
$ `Firearm Type`                                                                                                                                       <chr> …
$ `Number of Shooters`                                                                                                                                 <dbl> …
$ `Shooter Name`                                                                                                                                       <chr> …
$ `Shooter Age`                                                                                                                                        <dbl> …
$ `Shooter Gender`                                                                                                                                     <chr> …
$ Race                                                                                                                                                 <chr> …
$ `Shooter Ethnicity`                                                                                                                                  <chr> …
$ `Shooter's Affiliation with School`                                                                                                                  <chr> …
$ `Shooter had an accomplice who did not fire gun (Y/N)`                                                                                               <chr> …
$ `Hostages Taken (Y/N)`                                                                                                                               <chr> …

We can also use the utils str() function to see more detials about the values. Typically we would be able to see these with glimpse() but some of the columns have very long names, thus obscuring the first few values in the output.

tibble [1,556 × 47] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Date                                                                                                                                              : chr [1:1556] "1/5/1970" "1/5/1970" "1/5/1970" "2/6/1970" ...
 $ School                                                                                                                                            : chr [1:1556] "Hine Junior High School" "Sousa Junior High" "Unnamed High School" "John F. Kennedy High School" ...
 $ City                                                                                                                                              : chr [1:1556] "Washington" "Washington" "Washington" "Cleveland" ...
 $ State                                                                                                                                             : chr [1:1556] "DC" "DC" "DC" "OH" ...
 $ Reliability Score (1-5)                                                                                                                           : num [1:1556] 3 3 2 2 2 3 3 2 2 2 ...
 $ Killed (includes shooter)                                                                                                                         : num [1:1556] 1 0 0 0 0 1 1 0 0 0 ...
 $ Wounded                                                                                                                                           : num [1:1556] 0 1 0 1 2 5 0 1 2 1 ...
 $ Total Injured/Killed Victims                                                                                                                      : num [1:1556] 1 1 0 1 2 6 1 1 2 1 ...
 $ Gender of Victims (M/F/Both)                                                                                                                      : chr [1:1556] "Male" "Male" "No Victims" "Male" ...
 $ Victim's Affiliation w/ School                                                                                                                    : chr [1:1556] "Student" "Student" "No Victims" "Student" ...
 $ Victim's age(s)                                                                                                                                   : num [1:1556] 15 NA NA 18 NA NA 18 19 NA 15 ...
 $ Victims Race                                                                                                                                      : chr [1:1556] NA NA "No Victims" NA ...
 $ Victim Ethnicity                                                                                                                                  : chr [1:1556] NA NA "No Victims" NA ...
 $ Targeted Specific Victim(s)                                                                                                                       : chr [1:1556] "No" "No" "Yes" "Yes" ...
 $ Random Victims                                                                                                                                    : chr [1:1556] "Yes" "Yes" "No" "No" ...
 $ Bullied (Y/N/ N/A)                                                                                                                                : chr [1:1556] "No" "No" "No" "No" ...
 $ Domestic Violence (Y/N)                                                                                                                           : chr [1:1556] "No" "No" "No" "No" ...
 $ Suicide (Shooter was only victim) Y/N/ N/A                                                                                                        : chr [1:1556] "N/A" "N/A" "N/A" "N/A" ...
 $ Suicide (shot self immediately following initial shootings) Y/N/ N/A                                                                              : chr [1:1556] "N/A" "N/A" "N/A" "N/A" ...
 $ Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A: chr [1:1556] "N/A" "N/A" "N/A" "N/A" ...
 $ Suicide (or attempted suicide) by Shooter (Y/N)                                                                                                   : chr [1:1556] "No" "No" "No" "No" ...
 $ Shooter's actions immediately after shots fired                                                                                                   : chr [1:1556] "Unknown if Subdued Surrendered or Fled" "Immediately Surrendered" "Fled" "Unknown if Subdued Surrendered or Fled" ...
 $ Pre-planned school attack                                                                                                                         : chr [1:1556] "No" "No" "No" "No" ...
 $ Summary                                                                                                                                           : chr [1:1556] "Didn't know how to operate pistol, cocked hammer and couldn't get it to safely release causing accidental discharge" "Occurred during horseplay in the school" "Student shot at twice during attempted robbery on playground" "Argument in school hallway escalated into shooting" ...
 $ Category                                                                                                                                          : chr [1:1556] "Accidental" "Accidental" "Robbery" "Escalation of Dispute" ...
 $ School Type                                                                                                                                       : chr [1:1556] "High" "Junior High" "High" "High" ...
 $ Narrative (Detailed Summary/ Background)                                                                                                          : chr [1:1556] "Student showing off gun cocked hammer and could not get it to release causing accidental discharge and killing "| __truncated__ "14YOM student shot during \"horseplay\" in the school hallway. Friend of the victim surrendered to police." "Group of 10 teens attempted to rob 16YOM (James Owens) on school playground. When victim ran, unknown teen susp"| __truncated__ "Argument between shooter and victim escalated into shooting in school hallway." ...
 $ Sources                                                                                                                                           : chr [1:1556] "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998" "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998 https://www.newspapers.com/image/156467116/?"| __truncated__ "https://www.newspapers.com/image/156467116/?terms=school%2Bshooting" "https://www.newspapers.com/image/18059538/?terms=school%2Bshooting" ...
 $ Time of Occurrence (12 hour AM/PM)                                                                                                                : 'hms' num [1:1556] NA NA NA NA ...
  ..- attr(*, "units")= chr "secs"
 $ Duration (minutes)                                                                                                                                : num [1:1556] 1 1 1 1 NA 8 1 1 NA 1 ...
 $ Day of week (formula)                                                                                                                             : chr [1:1556] "Mon" "Mon" "Mon" "Fri" ...
 $ During School Day (Y/N)                                                                                                                           : chr [1:1556] "Yes" "Yes" "Yes" "Yes" ...
 $ Time Period                                                                                                                                       : chr [1:1556] NA NA NA NA ...
 $ During a Sporting Event (Y/N)                                                                                                                     : chr [1:1556] "No" "No" "No" "No" ...
 $ During a school sponsored event (school dance, concert, play, activity)                                                                           : chr [1:1556] "No" "No" "No" "No" ...
 $ Location                                                                                                                                          : chr [1:1556] "Inside School Building" "Inside School Building" "Outside on School Property" "Inside School Building" ...
 $ Number of Shots Fired                                                                                                                             : num [1:1556] 1 1 2 4 NA NA 1 1 2 NA ...
 $ Firearm Type                                                                                                                                      : chr [1:1556] "Handgun" "Handgun" "Handgun" "Handgun" ...
 $ Number of Shooters                                                                                                                                : num [1:1556] 1 1 1 1 2 8 1 1 1 2 ...
 $ Shooter Name                                                                                                                                      : chr [1:1556] "Minor" "Minor" "Unknown" "Gertis J. Perry" ...
 $ Shooter Age                                                                                                                                       : num [1:1556] 15 NA NA 18 NA NA 16 18 15 NA ...
 $ Shooter Gender                                                                                                                                    : chr [1:1556] "Male" "Male" "Male" "Male" ...
 $ Race                                                                                                                                              : chr [1:1556] NA NA NA NA ...
 $ Shooter Ethnicity                                                                                                                                 : chr [1:1556] NA NA NA "Not Hispanic or Latino" ...
 $ Shooter's Affiliation with School                                                                                                                 : chr [1:1556] "Student" "Student" "Student" "Student" ...
 $ Shooter had an accomplice who did not fire gun (Y/N)                                                                                              : chr [1:1556] "Yes" "No" "Yes" "No" ...
 $ Hostages Taken (Y/N)                                                                                                                              : chr [1:1556] "No" "No" "No" "No" ...
 - attr(*, "spec")=
  .. cols(
  ..   Date = col_character(),
  ..   School = col_character(),
  ..   City = col_character(),
  ..   State = col_character(),
  ..   `Reliability Score (1-5)` = col_double(),
  ..   `Killed (includes shooter)` = col_double(),
  ..   Wounded = col_double(),
  ..   `Total Injured/Killed Victims` = col_double(),
  ..   `Gender of Victims (M/F/Both)` = col_character(),
  ..   `Victim's Affiliation w/ School` = col_character(),
  ..   `Victim's age(s)` = col_double(),
  ..   `Victims Race` = col_character(),
  ..   `Victim Ethnicity` = col_character(),
  ..   `Targeted Specific Victim(s)` = col_character(),
  ..   `Random Victims` = col_character(),
  ..   `Bullied (Y/N/ N/A)` = col_character(),
  ..   `Domestic Violence (Y/N)` = col_character(),
  ..   `Suicide (Shooter was only victim) Y/N/ N/A` = col_character(),
  ..   `Suicide (shot self immediately following initial shootings) Y/N/ N/A` = col_character(),
  ..   `Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A` = col_character(),
  ..   `Suicide (or attempted suicide) by Shooter (Y/N)` = col_character(),
  ..   `Shooter's actions immediately after shots fired` = col_character(),
  ..   `Pre-planned school attack` = col_character(),
  ..   Summary = col_character(),
  ..   Category = col_character(),
  ..   `School Type` = col_character(),
  ..   `Narrative (Detailed Summary/ Background)` = col_character(),
  ..   Sources = col_character(),
  ..   `Time of Occurrence (12 hour AM/PM)` = col_time(format = ""),
  ..   `Duration (minutes)` = col_double(),
  ..   `Day of week (formula)` = col_character(),
  ..   `During School Day (Y/N)` = col_character(),
  ..   `Time Period` = col_character(),
  ..   `During a Sporting Event (Y/N)` = col_character(),
  ..   `During a school sponsored event (school dance, concert, play, activity)` = col_character(),
  ..   Location = col_character(),
  ..   `Number of Shots Fired` = col_double(),
  ..   `Firearm Type` = col_character(),
  ..   `Number of Shooters` = col_double(),
  ..   `Shooter Name` = col_character(),
  ..   `Shooter Age` = col_double(),
  ..   `Shooter Gender` = col_character(),
  ..   Race = col_character(),
  ..   `Shooter Ethnicity` = col_character(),
  ..   `Shooter's Affiliation with School` = col_character(),
  ..   `Shooter had an accomplice who did not fire gun (Y/N)` = col_character(),
  ..   `Hostages Taken (Y/N)` = col_character()
  .. )

Data Exploration and Wrangling


Luckily, our data is already in pretty good shape, but we want to make our data more useful for our dashboard.

Adding state name

It would be useful to have the full state name in our data, rather than just the abbreviation.

We can do so by using data related to the US 50 states in a dataset called state that is automatically loaded with R sessions in the datasets package. The state.abb object is a list of the state abbreviations and state.name is a list of the state names.

 [1] "AL" "AK" "AZ" "AR" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "ID" "IL" "IN" "IA"
[16] "KS" "KY" "LA" "ME" "MD" "MA" "MI" "MN" "MS" "MO" "MT" "NE" "NV" "NH" "NJ"
[31] "NM" "NY" "NC" "ND" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VT"
[46] "VA" "WA" "WV" "WI" "WY"
 [1] "Alabama"        "Alaska"         "Arizona"        "Arkansas"      
 [5] "California"     "Colorado"       "Connecticut"    "Delaware"      
 [9] "Florida"        "Georgia"        "Hawaii"         "Idaho"         
[13] "Illinois"       "Indiana"        "Iowa"           "Kansas"        
[17] "Kentucky"       "Louisiana"      "Maine"          "Maryland"      
[21] "Massachusetts"  "Michigan"       "Minnesota"      "Mississippi"   
[25] "Missouri"       "Montana"        "Nebraska"       "Nevada"        
[29] "New Hampshire"  "New Jersey"     "New Mexico"     "New York"      
[33] "North Carolina" "North Dakota"   "Ohio"           "Oklahoma"      
[37] "Oregon"         "Pennsylvania"   "Rhode Island"   "South Carolina"
[41] "South Dakota"   "Tennessee"      "Texas"          "Utah"          
[45] "Vermont"        "Virginia"       "Washington"     "West Virginia" 
[49] "Wisconsin"      "Wyoming"       

We will combine these using the tibble() function of the tibble() package.

# A tibble: 4 x 2
  State_abb State   
  <chr>     <chr>   
1 AL        Alabama 
2 AK        Alaska  
3 AZ        Arizona 
4 AR        Arkansas

Now we will combine this with our data using the left_join() function of the dplyr package. avocado add explanation and join images https://dplyr.tidyverse.org/reference/join.html

# A tibble: 4 x 4
  School                      City       State_abb State
  <chr>                       <chr>      <chr>     <chr>
1 Hine Junior High School     Washington DC        <NA> 
2 Sousa Junior High           Washington DC        <NA> 
3 Unnamed High School         Washington DC        <NA> 
4 John F. Kennedy High School Cleveland  OH        Ohio 

Reformating dates

We also want to reformat our date values and create a Date_year variable based on the year in each date. We can use the lubridate package for this.

The mdy() function converts dates into a format where dates are listed as month, date, and year with hyphens in between. The year() function can then be used to extract just the year from each date.

# A tibble: 1,556 x 2
   Date       Date_year
   <date>         <dbl>
 1 1970-01-05      1970
 2 1970-01-05      1970
 3 1970-01-05      1970
 4 1970-02-06      1970
 5 1970-03-23      1970
 6 1970-04-15      1970
 7 1970-04-22      1970
 8 1970-05-08      1970
 9 1970-05-15      1970
10 1970-08-28      1970
# … with 1,546 more rows

Looks good!

One last thing to do is to convert Yes and No values into TRUE and FALSE.

First let’s take a look at our data:

tibble [1,556 × 49] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Date                                                                                                                                              : Date[1:1556], format: "1970-01-05" "1970-01-05" ...
 $ School                                                                                                                                            : chr [1:1556] "Hine Junior High School" "Sousa Junior High" "Unnamed High School" "John F. Kennedy High School" ...
 $ City                                                                                                                                              : chr [1:1556] "Washington" "Washington" "Washington" "Cleveland" ...
 $ State_abb                                                                                                                                         : chr [1:1556] "DC" "DC" "DC" "OH" ...
 $ Reliability Score (1-5)                                                                                                                           : num [1:1556] 3 3 2 2 2 3 3 2 2 2 ...
 $ Killed (includes shooter)                                                                                                                         : num [1:1556] 1 0 0 0 0 1 1 0 0 0 ...
 $ Wounded                                                                                                                                           : num [1:1556] 0 1 0 1 2 5 0 1 2 1 ...
 $ Total Injured/Killed Victims                                                                                                                      : num [1:1556] 1 1 0 1 2 6 1 1 2 1 ...
 $ Gender of Victims (M/F/Both)                                                                                                                      : chr [1:1556] "Male" "Male" "No Victims" "Male" ...
 $ Victim's Affiliation w/ School                                                                                                                    : chr [1:1556] "Student" "Student" "No Victims" "Student" ...
 $ Victim's age(s)                                                                                                                                   : num [1:1556] 15 NA NA 18 NA NA 18 19 NA 15 ...
 $ Victims Race                                                                                                                                      : chr [1:1556] NA NA "No Victims" NA ...
 $ Victim Ethnicity                                                                                                                                  : chr [1:1556] NA NA "No Victims" NA ...
 $ Targeted Specific Victim(s)                                                                                                                       : chr [1:1556] "No" "No" "Yes" "Yes" ...
 $ Random Victims                                                                                                                                    : chr [1:1556] "Yes" "Yes" "No" "No" ...
 $ Bullied (Y/N/ N/A)                                                                                                                                : chr [1:1556] "No" "No" "No" "No" ...
 $ Domestic Violence (Y/N)                                                                                                                           : chr [1:1556] "No" "No" "No" "No" ...
 $ Suicide (Shooter was only victim) Y/N/ N/A                                                                                                        : chr [1:1556] "N/A" "N/A" "N/A" "N/A" ...
 $ Suicide (shot self immediately following initial shootings) Y/N/ N/A                                                                              : chr [1:1556] "N/A" "N/A" "N/A" "N/A" ...
 $ Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A: chr [1:1556] "N/A" "N/A" "N/A" "N/A" ...
 $ Suicide (or attempted suicide) by Shooter (Y/N)                                                                                                   : chr [1:1556] "No" "No" "No" "No" ...
 $ Shooter's actions immediately after shots fired                                                                                                   : chr [1:1556] "Unknown if Subdued Surrendered or Fled" "Immediately Surrendered" "Fled" "Unknown if Subdued Surrendered or Fled" ...
 $ Pre-planned school attack                                                                                                                         : chr [1:1556] "No" "No" "No" "No" ...
 $ Summary                                                                                                                                           : chr [1:1556] "Didn't know how to operate pistol, cocked hammer and couldn't get it to safely release causing accidental discharge" "Occurred during horseplay in the school" "Student shot at twice during attempted robbery on playground" "Argument in school hallway escalated into shooting" ...
 $ Category                                                                                                                                          : chr [1:1556] "Accidental" "Accidental" "Robbery" "Escalation of Dispute" ...
 $ School Type                                                                                                                                       : chr [1:1556] "High" "Junior High" "High" "High" ...
 $ Narrative (Detailed Summary/ Background)                                                                                                          : chr [1:1556] "Student showing off gun cocked hammer and could not get it to release causing accidental discharge and killing "| __truncated__ "14YOM student shot during \"horseplay\" in the school hallway. Friend of the victim surrendered to police." "Group of 10 teens attempted to rob 16YOM (James Owens) on school playground. When victim ran, unknown teen susp"| __truncated__ "Argument between shooter and victim escalated into shooting in school hallway." ...
 $ Sources                                                                                                                                           : chr [1:1556] "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998" "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998 https://www.newspapers.com/image/156467116/?"| __truncated__ "https://www.newspapers.com/image/156467116/?terms=school%2Bshooting" "https://www.newspapers.com/image/18059538/?terms=school%2Bshooting" ...
 $ Time of Occurrence (12 hour AM/PM)                                                                                                                : 'hms' num [1:1556] NA NA NA NA ...
  ..- attr(*, "units")= chr "secs"
 $ Duration (minutes)                                                                                                                                : num [1:1556] 1 1 1 1 NA 8 1 1 NA 1 ...
 $ Day of week (formula)                                                                                                                             : chr [1:1556] "Mon" "Mon" "Mon" "Fri" ...
 $ During School Day (Y/N)                                                                                                                           : chr [1:1556] "Yes" "Yes" "Yes" "Yes" ...
 $ Time Period                                                                                                                                       : chr [1:1556] NA NA NA NA ...
 $ During a Sporting Event (Y/N)                                                                                                                     : chr [1:1556] "No" "No" "No" "No" ...
 $ During a school sponsored event (school dance, concert, play, activity)                                                                           : chr [1:1556] "No" "No" "No" "No" ...
 $ Location                                                                                                                                          : chr [1:1556] "Inside School Building" "Inside School Building" "Outside on School Property" "Inside School Building" ...
 $ Number of Shots Fired                                                                                                                             : num [1:1556] 1 1 2 4 NA NA 1 1 2 NA ...
 $ Firearm Type                                                                                                                                      : chr [1:1556] "Handgun" "Handgun" "Handgun" "Handgun" ...
 $ Number of Shooters                                                                                                                                : num [1:1556] 1 1 1 1 2 8 1 1 1 2 ...
 $ Shooter Name                                                                                                                                      : chr [1:1556] "Minor" "Minor" "Unknown" "Gertis J. Perry" ...
 $ Shooter Age                                                                                                                                       : num [1:1556] 15 NA NA 18 NA NA 16 18 15 NA ...
 $ Shooter Gender                                                                                                                                    : chr [1:1556] "Male" "Male" "Male" "Male" ...
 $ Race                                                                                                                                              : chr [1:1556] NA NA NA NA ...
 $ Shooter Ethnicity                                                                                                                                 : chr [1:1556] NA NA NA "Not Hispanic or Latino" ...
 $ Shooter's Affiliation with School                                                                                                                 : chr [1:1556] "Student" "Student" "Student" "Student" ...
 $ Shooter had an accomplice who did not fire gun (Y/N)                                                                                              : chr [1:1556] "Yes" "No" "Yes" "No" ...
 $ Hostages Taken (Y/N)                                                                                                                              : chr [1:1556] "No" "No" "No" "No" ...
 $ State                                                                                                                                             : chr [1:1556] NA NA NA "Ohio" ...
 $ Date_year                                                                                                                                         : num [1:1556] 1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
 - attr(*, "spec")=
  .. cols(
  ..   Date = col_character(),
  ..   School = col_character(),
  ..   City = col_character(),
  ..   State = col_character(),
  ..   `Reliability Score (1-5)` = col_double(),
  ..   `Killed (includes shooter)` = col_double(),
  ..   Wounded = col_double(),
  ..   `Total Injured/Killed Victims` = col_double(),
  ..   `Gender of Victims (M/F/Both)` = col_character(),
  ..   `Victim's Affiliation w/ School` = col_character(),
  ..   `Victim's age(s)` = col_double(),
  ..   `Victims Race` = col_character(),
  ..   `Victim Ethnicity` = col_character(),
  ..   `Targeted Specific Victim(s)` = col_character(),
  ..   `Random Victims` = col_character(),
  ..   `Bullied (Y/N/ N/A)` = col_character(),
  ..   `Domestic Violence (Y/N)` = col_character(),
  ..   `Suicide (Shooter was only victim) Y/N/ N/A` = col_character(),
  ..   `Suicide (shot self immediately following initial shootings) Y/N/ N/A` = col_character(),
  ..   `Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A` = col_character(),
  ..   `Suicide (or attempted suicide) by Shooter (Y/N)` = col_character(),
  ..   `Shooter's actions immediately after shots fired` = col_character(),
  ..   `Pre-planned school attack` = col_character(),
  ..   Summary = col_character(),
  ..   Category = col_character(),
  ..   `School Type` = col_character(),
  ..   `Narrative (Detailed Summary/ Background)` = col_character(),
  ..   Sources = col_character(),
  ..   `Time of Occurrence (12 hour AM/PM)` = col_time(format = ""),
  ..   `Duration (minutes)` = col_double(),
  ..   `Day of week (formula)` = col_character(),
  ..   `During School Day (Y/N)` = col_character(),
  ..   `Time Period` = col_character(),
  ..   `During a Sporting Event (Y/N)` = col_character(),
  ..   `During a school sponsored event (school dance, concert, play, activity)` = col_character(),
  ..   Location = col_character(),
  ..   `Number of Shots Fired` = col_double(),
  ..   `Firearm Type` = col_character(),
  ..   `Number of Shooters` = col_double(),
  ..   `Shooter Name` = col_character(),
  ..   `Shooter Age` = col_double(),
  ..   `Shooter Gender` = col_character(),
  ..   Race = col_character(),
  ..   `Shooter Ethnicity` = col_character(),
  ..   `Shooter's Affiliation with School` = col_character(),
  ..   `Shooter had an accomplice who did not fire gun (Y/N)` = col_character(),
  ..   `Hostages Taken (Y/N)` = col_character()
  .. )

We see that many of the varaibles have either Yes or No values or Y and N values. These are the variables that have Y/N in the name or the Targeted Specific Victim(s), Random Victims, Pre-planned school attack variables. We can make these consistently TRUE and FALSE by using the case_when() function of the dplyr package. This function allows us to specify new values for existing values, simlarly to the recode() function also of dplyr. The benefit of the case_when() function, is that changing the values to TRUE or FALSE also results in the class type of the variable changing to type logical (which is interpreted as a binary variable with TRUE and FALSE values) otherwise, with recode() the variables would remain as class type character.

click here for more details about the differences between recode() and case_when()`

avocado check on these statements - this does not seem to be true for case_when despite what the documentation says “If no cases match, NA is returned.”

Note, that with recode() there is the option that other values be recoded to NA althought this is not the default, however with case_when() other values not explicitly assigned in the case_when() statement will be NA. Further more only values can be used on the left side when using recode() whereas case_when() accepts expressions that need to be evaluated, unless using the := opperator.???


avocado add links about this/ maybe add /check if we already added the class type stuff from the other case studies - indeed casewhen in other cases seems to automatically make all other cases NA but was that the case here?

To implement the case_when() recoding of values, the exisiting values are written on the left of the ~ sign (quotation marks necessary) and new values are written on the right (quotations marks are not necessary as these are TRUE and FALSE statments). We will also use the across() function of the dplyr package and the matches() function of the tidyselect packge to allow us to apply this to all of the variables that have a pattern that that matches any of those of the variables we want to change. The | symbol is interpreted as an or, thus any variables that has a name that matches any of these patterns will be changed. fThe across() function then applies the case_when() function to all of these variables. Notice that the ~ symbol is necessary before the funtion that is applied using across().

# A tibble: 1,556 x 13
   `Targeted Speci… `Random Victims` `Bullied (Y/N/ … `Domestic Viole…
   <chr>            <chr>            <chr>            <chr>           
 1 No               Yes              No               No              
 2 No               Yes              No               No              
 3 Yes              No               No               No              
 4 Yes              No               No               No              
 5 No               No               No               No              
 6 Yes              Yes              No               No              
 7 Yes              No               No               No              
 8 Yes              No               No               No              
 9 No               Yes              <NA>             No              
10 Yes              No               No               No              
# … with 1,546 more rows, and 9 more variables: `Suicide (Shooter was only
#   victim) Y/N/ N/A` <chr>, `Suicide (shot self immediately following initial
#   shootings) Y/N/ N/A` <chr>, `Suicide (e.g., shot self at end of incident -
#   time period between first shots and suicide, different location, when
#   confronted by police) Y/N/ N/A` <chr>, `Suicide (or attempted suicide) by
#   Shooter (Y/N)` <chr>, `Pre-planned school attack` <chr>, `During School Day
#   (Y/N)` <chr>, `During a Sporting Event (Y/N)` <chr>, `Shooter had an
#   accomplice who did not fire gun (Y/N)` <chr>, `Hostages Taken (Y/N)` <chr>
# A tibble: 1,556 x 13
   `Targeted Speci… `Random Victims` `Bullied (Y/N/ … `Domestic Viole…
   <lgl>            <lgl>            <lgl>            <lgl>           
 1 FALSE            TRUE             FALSE            FALSE           
 2 FALSE            TRUE             FALSE            FALSE           
 3 TRUE             FALSE            FALSE            FALSE           
 4 TRUE             FALSE            FALSE            FALSE           
 5 FALSE            FALSE            FALSE            FALSE           
 6 TRUE             TRUE             FALSE            FALSE           
 7 TRUE             FALSE            FALSE            FALSE           
 8 TRUE             FALSE            FALSE            FALSE           
 9 FALSE            TRUE             NA               FALSE           
10 TRUE             FALSE            FALSE            FALSE           
# … with 1,546 more rows, and 9 more variables: `Suicide (Shooter was only
#   victim) Y/N/ N/A` <lgl>, `Suicide (shot self immediately following initial
#   shootings) Y/N/ N/A` <lgl>, `Suicide (e.g., shot self at end of incident -
#   time period between first shots and suicide, different location, when
#   confronted by police) Y/N/ N/A` <lgl>, `Suicide (or attempted suicide) by
#   Shooter (Y/N)` <lgl>, `Pre-planned school attack` <lgl>, `During School Day
#   (Y/N)` <lgl>, `During a Sporting Event (Y/N)` <lgl>, `Shooter had an
#   accomplice who did not fire gun (Y/N)` <lgl>, `Hostages Taken (Y/N)` <lgl>

tibble [1,556 × 49] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Date                                                                                                                                              : Date[1:1556], format: "1970-01-05" "1970-01-05" ...
 $ School                                                                                                                                            : chr [1:1556] "Hine Junior High School" "Sousa Junior High" "Unnamed High School" "John F. Kennedy High School" ...
 $ City                                                                                                                                              : chr [1:1556] "Washington" "Washington" "Washington" "Cleveland" ...
 $ State_abb                                                                                                                                         : chr [1:1556] "DC" "DC" "DC" "OH" ...
 $ Reliability Score (1-5)                                                                                                                           : num [1:1556] 3 3 2 2 2 3 3 2 2 2 ...
 $ Killed (includes shooter)                                                                                                                         : num [1:1556] 1 0 0 0 0 1 1 0 0 0 ...
 $ Wounded                                                                                                                                           : num [1:1556] 0 1 0 1 2 5 0 1 2 1 ...
 $ Total Injured/Killed Victims                                                                                                                      : num [1:1556] 1 1 0 1 2 6 1 1 2 1 ...
 $ Gender of Victims (M/F/Both)                                                                                                                      : chr [1:1556] "Male" "Male" "No Victims" "Male" ...
 $ Victim's Affiliation w/ School                                                                                                                    : chr [1:1556] "Student" "Student" "No Victims" "Student" ...
 $ Victim's age(s)                                                                                                                                   : num [1:1556] 15 NA NA 18 NA NA 18 19 NA 15 ...
 $ Victims Race                                                                                                                                      : chr [1:1556] NA NA "No Victims" NA ...
 $ Victim Ethnicity                                                                                                                                  : chr [1:1556] NA NA "No Victims" NA ...
 $ Targeted Specific Victim(s)                                                                                                                       : logi [1:1556] FALSE FALSE TRUE TRUE FALSE TRUE ...
 $ Random Victims                                                                                                                                    : logi [1:1556] TRUE TRUE FALSE FALSE FALSE TRUE ...
 $ Bullied (Y/N/ N/A)                                                                                                                                : logi [1:1556] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Domestic Violence (Y/N)                                                                                                                           : logi [1:1556] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Suicide (Shooter was only victim) Y/N/ N/A                                                                                                        : logi [1:1556] NA NA NA NA NA NA ...
 $ Suicide (shot self immediately following initial shootings) Y/N/ N/A                                                                              : logi [1:1556] NA NA NA NA NA NA ...
 $ Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A: logi [1:1556] NA NA NA NA NA NA ...
 $ Suicide (or attempted suicide) by Shooter (Y/N)                                                                                                   : logi [1:1556] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Shooter's actions immediately after shots fired                                                                                                   : chr [1:1556] "Unknown if Subdued Surrendered or Fled" "Immediately Surrendered" "Fled" "Unknown if Subdued Surrendered or Fled" ...
 $ Pre-planned school attack                                                                                                                         : logi [1:1556] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Summary                                                                                                                                           : chr [1:1556] "Didn't know how to operate pistol, cocked hammer and couldn't get it to safely release causing accidental discharge" "Occurred during horseplay in the school" "Student shot at twice during attempted robbery on playground" "Argument in school hallway escalated into shooting" ...
 $ Category                                                                                                                                          : chr [1:1556] "Accidental" "Accidental" "Robbery" "Escalation of Dispute" ...
 $ School Type                                                                                                                                       : chr [1:1556] "High" "Junior High" "High" "High" ...
 $ Narrative (Detailed Summary/ Background)                                                                                                          : chr [1:1556] "Student showing off gun cocked hammer and could not get it to release causing accidental discharge and killing "| __truncated__ "14YOM student shot during \"horseplay\" in the school hallway. Friend of the victim surrendered to police." "Group of 10 teens attempted to rob 16YOM (James Owens) on school playground. When victim ran, unknown teen susp"| __truncated__ "Argument between shooter and victim escalated into shooting in school hallway." ...
 $ Sources                                                                                                                                           : chr [1:1556] "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998" "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998 https://www.newspapers.com/image/156467116/?"| __truncated__ "https://www.newspapers.com/image/156467116/?terms=school%2Bshooting" "https://www.newspapers.com/image/18059538/?terms=school%2Bshooting" ...
 $ Time of Occurrence (12 hour AM/PM)                                                                                                                : 'hms' num [1:1556] NA NA NA NA ...
  ..- attr(*, "units")= chr "secs"
 $ Duration (minutes)                                                                                                                                : num [1:1556] 1 1 1 1 NA 8 1 1 NA 1 ...
 $ Day of week (formula)                                                                                                                             : chr [1:1556] "Mon" "Mon" "Mon" "Fri" ...
 $ During School Day (Y/N)                                                                                                                           : logi [1:1556] TRUE TRUE TRUE TRUE FALSE TRUE ...
 $ Time Period                                                                                                                                       : chr [1:1556] NA NA NA NA ...
 $ During a Sporting Event (Y/N)                                                                                                                     : logi [1:1556] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ During a school sponsored event (school dance, concert, play, activity)                                                                           : chr [1:1556] "No" "No" "No" "No" ...
 $ Location                                                                                                                                          : chr [1:1556] "Inside School Building" "Inside School Building" "Outside on School Property" "Inside School Building" ...
 $ Number of Shots Fired                                                                                                                             : num [1:1556] 1 1 2 4 NA NA 1 1 2 NA ...
 $ Firearm Type                                                                                                                                      : chr [1:1556] "Handgun" "Handgun" "Handgun" "Handgun" ...
 $ Number of Shooters                                                                                                                                : num [1:1556] 1 1 1 1 2 8 1 1 1 2 ...
 $ Shooter Name                                                                                                                                      : chr [1:1556] "Minor" "Minor" "Unknown" "Gertis J. Perry" ...
 $ Shooter Age                                                                                                                                       : num [1:1556] 15 NA NA 18 NA NA 16 18 15 NA ...
 $ Shooter Gender                                                                                                                                    : chr [1:1556] "Male" "Male" "Male" "Male" ...
 $ Race                                                                                                                                              : chr [1:1556] NA NA NA NA ...
 $ Shooter Ethnicity                                                                                                                                 : chr [1:1556] NA NA NA "Not Hispanic or Latino" ...
 $ Shooter's Affiliation with School                                                                                                                 : chr [1:1556] "Student" "Student" "Student" "Student" ...
 $ Shooter had an accomplice who did not fire gun (Y/N)                                                                                              : logi [1:1556] TRUE FALSE TRUE FALSE TRUE TRUE ...
 $ Hostages Taken (Y/N)                                                                                                                              : logi [1:1556] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ State                                                                                                                                             : chr [1:1556] NA NA NA "Ohio" ...
 $ Date_year                                                                                                                                         : num [1:1556] 1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
 - attr(*, "spec")=
  .. cols(
  ..   Date = col_character(),
  ..   School = col_character(),
  ..   City = col_character(),
  ..   State = col_character(),
  ..   `Reliability Score (1-5)` = col_double(),
  ..   `Killed (includes shooter)` = col_double(),
  ..   Wounded = col_double(),
  ..   `Total Injured/Killed Victims` = col_double(),
  ..   `Gender of Victims (M/F/Both)` = col_character(),
  ..   `Victim's Affiliation w/ School` = col_character(),
  ..   `Victim's age(s)` = col_double(),
  ..   `Victims Race` = col_character(),
  ..   `Victim Ethnicity` = col_character(),
  ..   `Targeted Specific Victim(s)` = col_character(),
  ..   `Random Victims` = col_character(),
  ..   `Bullied (Y/N/ N/A)` = col_character(),
  ..   `Domestic Violence (Y/N)` = col_character(),
  ..   `Suicide (Shooter was only victim) Y/N/ N/A` = col_character(),
  ..   `Suicide (shot self immediately following initial shootings) Y/N/ N/A` = col_character(),
  ..   `Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A` = col_character(),
  ..   `Suicide (or attempted suicide) by Shooter (Y/N)` = col_character(),
  ..   `Shooter's actions immediately after shots fired` = col_character(),
  ..   `Pre-planned school attack` = col_character(),
  ..   Summary = col_character(),
  ..   Category = col_character(),
  ..   `School Type` = col_character(),
  ..   `Narrative (Detailed Summary/ Background)` = col_character(),
  ..   Sources = col_character(),
  ..   `Time of Occurrence (12 hour AM/PM)` = col_time(format = ""),
  ..   `Duration (minutes)` = col_double(),
  ..   `Day of week (formula)` = col_character(),
  ..   `During School Day (Y/N)` = col_character(),
  ..   `Time Period` = col_character(),
  ..   `During a Sporting Event (Y/N)` = col_character(),
  ..   `During a school sponsored event (school dance, concert, play, activity)` = col_character(),
  ..   Location = col_character(),
  ..   `Number of Shots Fired` = col_double(),
  ..   `Firearm Type` = col_character(),
  ..   `Number of Shooters` = col_double(),
  ..   `Shooter Name` = col_character(),
  ..   `Shooter Age` = col_double(),
  ..   `Shooter Gender` = col_character(),
  ..   Race = col_character(),
  ..   `Shooter Ethnicity` = col_character(),
  ..   `Shooter's Affiliation with School` = col_character(),
  ..   `Shooter had an accomplice who did not fire gun (Y/N)` = col_character(),
  ..   `Hostages Taken (Y/N)` = col_character()
  .. )

Geocoding with the ggmap package

To peform the geocoding we need the address of each school in the data set. The data currently does not list the actual address, but does have information about the school where the event occured. Since some schools have the same name, we need the city and state data as well. So we will create a new variable in our data called address using the mutate() function of the dplyr package. This variable will collapse the values in the School, City, and State columns but with spaces in between. It is specified that there will be space in between by the sep = " " argument. Note that a space is typed between the quotation marks. Then we can use the address variable to look up the latitude and longtitude for each school.

Notice that we used a %>% in the previous chunk of code. This allows us to create code with a method called piping.

It allows us to perform many sequential steps efficiently.


Click here if you are unfamiliar with piping in R, which uses this %>% operator.

By piping we mean using the %>% pipe operator which is accessible after loading the tidyverse or several of the packages within the tidyverse like dplyr because they load the magrittr package. This allows us to perform multiple sequential steps on one data input. The object on the left side is used as input to any commands to the right or below.


We can take a look at just this new address variable using the pull() function of the dplyr() package.

   [1] "Hine Junior High School Washington DC"                                 
   [2] "Sousa Junior High Washington DC"                                       
   [3] "Unnamed High School Washington DC"                                     
   [4] "John F. Kennedy High School Cleveland OH"                              
   [5] "David Starr Jordan High School Long Beach CA"                          
   [6] "Pine Bluff Coleman High School Pine Bluff AR"                          
   [7] "Pierre S. Dupont High School Wilmington DE"                            
   [8] "Carver High School Delray Beach FL"                                    
   [9] "Ben Lomond High School Ogden UT"                                       
  [10] "Riverside High School El Paso TX"                                      
  [11] "Allapatah Elementary School Miami FL"                                  
  [12] "Hamilton High School Nashville TN"                                     
  [13] "Meridian High School Meridian ID"                                      
  [14] "Central High School Davenport IA"                                      
  [15] "Pontiac Central High School Detroit MI"                                
  [16] "Booker T. Washington High School Nashville TN"                         
  [17] "Washington Junior High School Nashville TN"                            
  [18] "Appleseed Junior High School Mansfield OH"                             
  [19] "Harlan High School Chicago IL"                                         
  [20] "Xavier High School Appleton WI"                                        
  [21] "Morris E. Leeds Middle School Philadelphia PA"                         
  [22] "John F. Kennedy High School Willingboro PA"                            
  [23] "Oak Cliff High School Dallas TX"                                       
  [24] "Franklin D. Roosevelt Junior High School Cleveland OH"                 
  [25] "Roskruge Junior High School Tucson AZ"                                 
  [26] "William Penn High School Harrisburg PA"                                
  [27] "Benton Harbor High School Saint Joseph MI"                             
  [28] "East Aurora Middle School East Aurora NY"                              
  [29] "Monessen High School Monessen PA"                                      
  [30] "Dunbar High School Lubbock TX"                                         
  [31] "McKinley Vocational High School Buffalo NY"                            
  [32] "Central High School Minneapolis MN"                                    
  [33] "Peabody Junior High School Petersburg VA"                              
  [34] "City College High School Baltimore MD"                                 
  [35] "Frederick Douglass High School Baltimore MD"                           
  [36] "Forest Park High School Baltimore MD"                                  
  [37] "Carlsbad Mid-High School Carlsbad NM"                                  
  [38] "Grove Elementary School Grove OK"                                      
  [39] "Edmondson Senior High School Baltimore MD"                             
  [40] "Louis Stevenson Junior High School Los Angeles CA"                     
  [41] "Carver Vocational High School Baltimore MD"                            
  [42] "Parkview Elementary School Washington DC"                              
  [43] "Stow High School Stow OH"                                              
  [44] "Harlem Park Junior High School Baltimore MD"                           
  [45] "Gwynn Falls Junior High School Baltimore MD"                           
  [46] "Camlumet High School Chicago IL"                                       
  [47] "Kenwood High School Chicago IL"                                        
  [48] "Markham Junior High School Los Angeles CA"                             
  [49] "Unnamed Junior High School Houston TX"                                 
  [50] "East Ascension Junior High Gonzales LA"                                
  [51] "Libby Booth Elementary School Reno NV"                                 
  [52] "Decatur Central High School Indianapolis IN"                           
  [53] "Francis Scott Key Junior High Houston TX"                              
  [54] "Saginaw High School Saginaw MI"                                        
  [55] "Cullen Junior High Houston TX"                                         
  [56] "Thorton Junior High Akron OH"                                          
  [57] "Jefferson High School Los Angeles CA"                                  
  [58] "Pontiac Central High School Pontiac MI"                                
  [59] "Miami Northwest High School Miami FL"                                  
  [60] "South Iredell High School Statesville NC"                              
  [61] "John Marshall High School Los Angeles CA"                              
  [62] "Cumming High School Burlington NC"                                     
  [63] "Booker T. Washington High SChool Montgomery AL"                        
  [64] "Armstrong High School Richmond VA"                                     
  [65] "Locke High School Los Angeles CA"                                      
  [66] "Rayen High School Youngtown OH"                                        
  [67] "Wilson High School Los Angeles CA"                                     
  [68] "Elmhurst Wood Park Community High School Almwood Park IL"              
  [69] "Beaumont High School St. Louis MO"                                     
  [70] "Sumner High School St. Louis MO"                                       
  [71] "Barberton High School Barberton OH"                                    
  [72] "Central High School Minneapolis MN"                                    
  [73] "Northwestern High School St. Louis MO"                                 
  [74] "Woodell Phillips High School Chicago IL"                               
  [75] "Long Beach Polytechnic High School Los Angeles CA"                     
  [76] "Fremont High School Los Angeles CA"                                    
  [77] "Hughes High School Cincinnati OH"                                      
  [78] "Barton Elementary School Chicago IL"                                   
  [79] "Locke High School Los Angeles CA"                                      
  [80] "James Madison Junior High School Oakland CA"                           
  [81] "Brownstown Central High School Brownstown IN"                          
  [82] "St. Stephen's Parochial School Bridgeport CT"                          
  [83] "Church Hill High School Rogersville TN"                                
  [84] "Highlands Elementary School Orlando FL"                                
  [85] "Jefferson High School Daly City CA"                                    
  [86] "San Fernando High School Los Angeles CA"                               
  [87] "Destrehan High School Hahnville LA"                                    
  [88] "Douglass High School Baltimore MD"                                     
  [89] "C. A. Brown High School Charleston SC"                                 
  [90] "Booker Junior High School Little Rock AR"                              
  [91] "C. A. Brown High School Charleston SC"                                 
  [92] "Manual Arts High School Los Angeles CA"                                
  [93] "Olean High School Olean NY"                                            
  [94] "Board of Cooperative Educational Services Minola NY"                   
  [95] "St. James School Penns Grove NJ"                                       
  [96] "Jones High School Houston TX"                                          
  [97] "Sumner High School St. Louis MO"                                       
  [98] "Fairmount Elementary School Richmond VA"                               
  [99] "Patterson Cooperative High School Dayton OH"                           
 [100] "Rock Junior High School St. Louis MO"                                  
 [101] "Pitcher School Detroit MI"                                             
 [102] "Dett Elementary School Chicago IL"                                     
 [103] "Central High School St. Louis MO"                                      
 [104] "Grant High School Oklahoma City OK"                                    
 [105] "Hermosa Elementary School Artesia NM"                                  
 [106] "Murphy High School Atlanta GA"                                         
 [107] "Orange High School Santa Ana CA"                                       
 [108] "Camelback High School Phoenix AZ"                                      
 [109] "Columbus Central High School Columbus OH"                              
 [110] "Escambia High School Pensacola FL"                                     
 [111] "Murray-Wright High School Detroit MI"                                  
 [112] "O. D. Wyatt High School Fort Worth TX"                                 
 [113] "Mark Twain School St. Louis MO"                                        
 [114] "Palm Beach Gardens High School West Palm Beach FL"                     
 [115] "Mt. Savage High School Cumberland MD"                                  
 [116] "Guildord County School Bus Greensboro NC"                              
 [117] "Burt Elementary School Detroit MI"                                     
 [118] "Fremont School St. Louis MO"                                           
 [119] "Old Main Eisenhower High School Blue Island IL"                        
 [120] "Fenger High School Chicago IL"                                         
 [121] "Horace Mann Junior High School Amarillo TX"                            
 [122] "Roosevelt High School St. Louis MO"                                    
 [123] "Collinsville High School Edwardsville IL"                              
 [124] "Parochial School Hamburg NY"                                           
 [125] "Whitharral High School Whitharral TX"                                  
 [126] "Pioneer Christian Academy Nashville TN"                                
 [127] "Stone Middle School Cocoa FL"                                          
 [128] "Holy Trinity High School Chicago IL"                                   
 [129] "South Junior High School Colorado Springs CO"                          
 [130] "Vashon High School St. Louis MO"                                       
 [131] "Hazelwood Central Senior High School St. Louis MO"                     
 [132] "Petaluma McNear Elementary Santa Rosa CA"                              
 [133] "West Orange High School Winter Garden FL"                              
 [134] "Blue Hills Vocational High School Canton MA"                           
 [135] "Christian County Middle School Hopkinsville KY"                        
 [136] "Hayes Junior High School St. Albans WV"                                
 [137] "Everett High School Lansing MI"                                        
 [138] "Monroe Elementary School Santa Rosa CA"                                
 [139] "Gallatin Junior High School Nashville TN"                              
 [140] "Fordson High School Detroit MI"                                        
 [141] "Paul Dunbar Elementary School Dallas TX"                               
 [142] "Ridgewood High School Norridge IL"                                     
 [143] "Murchison Junior High School Austin TX"                                
 [144] "Downtown Junior High School Philadelphia PA"                           
 [145] "Dover Air High Dover DE"                                               
 [146] "Weymouth South High School Weymouth MA"                                
 [147] "Lanett Junior High School Lanett AL"                                   
 [148] "University City High School University City MO"                        
 [149] "Park West High School New York NY"                                     
 [150] "Wilbur Cross High School New Haven CT"                                 
 [151] "Grover Cleveland Elementary School San Diego CA"                       
 [152] "McArthur High School North Miami FL"                                   
 [153] "Los Angeles High School Los Angeles CA"                                
 [154] "Wisconsin Lutheran High School Milwaukee WI"                           
 [155] "Martin L. Mattei Junior High School Hughestown PA"                     
 [156] "Azle Junior High School Azle TX"                                       
 [157] "New Carlisle Elementary School New Carlisle OH"                        
 [158] "Carter G. Woodson Middle School New Orleans LA"                        
 [159] "Charlestown High School Charlestown MA"                                
 [160] "O'Fallen Technical High School St. Louis MO"                           
 [161] "Washington High School Indianapolis IN"                                
 [162] "Not listed Lewisville TX"                                              
 [163] "Eastern High School Baltimore MD"                                      
 [164] "Blewett Middle School St. Louis MO"                                    
 [165] "Stamps High School Stamps AR"                                          
 [166] "Lafayette High School Williamsburg VA"                                 
 [167] "Langdon Elementary School Washington, DC DC"                           
 [168] "Valley View Elementary School Longview TX"                             
 [169] "Arsenal Technical High School Indianapolis IN"                         
 [170] "Hughes School McComb MS"                                               
 [171] "J. Leslie Patton School Dallas TX"                                     
 [172] "Frederick Douglass Senior High School Baltimore MD"                    
 [173] "Capeville Elementary School Capeville VA"                              
 [174] "Clara Barton High School Brooklyn NY"                                  
 [175] "Whittier High School Los Angeles CA"                                   
 [176] "Forrest HIgh School Jacksonville FL"                                   
 [177] "Springarn High School Washington DC"                                   
 [178] "John S. Shaw High School Mobile AL"                                    
 [179] "Bridgeport Central High School Bridgeport CT"                          
 [180] "Central High School Tuscaloosa AL"                                     
 [181] "Hueytown High School Hueytown AL"                                      
 [182] "Eastern Hills High School Fort Worth TX"                               
 [183] "Longfellow Junior HIgh School Lorain OH"                               
 [184] "Parker High School Birmingham AL"                                      
 [185] "Willetts Middle School Brunswick OH"                                   
 [186] "Francis M. Wood Senior High School Baltimore MD"                       
 [187] "Manuel Arts High School Los Angeles CA"                                
 [188] "Little Rock Hall High School Little Rock AR"                           
 [189] "Marshall High School Indianapolis IN"                                  
 [190] "Dillard High School Fort Lauderdale FL"                                
 [191] "Alexander Hamilton Junior High School Cleveland OH"                    
 [192] "Poplarville High School Poplarville MS"                                
 [193] "New Iberia Junior HIgh School New Iberia LA"                           
 [194] "Stuart Middle School West Palm Beach FL"                               
 [195] "William Longstreth Elementary School Philadelphia PA"                  
 [196] "Hobbs High School Santa Fe NM"                                         
 [197] "Aberdeen High School Aberdeen MD"                                      
 [198] "Hartford Public High School Hartford CT"                               
 [199] "George W. Wingate High School Brooklyn NY"                             
 [200] "Unnamed school Houston TX"                                             
 [201] "James Madison High School Brooklyn NY"                                 
 [202] "Hamilton High School Memphis TN"                                       
 [203] "Dorchester High School Dorchester MA"                                  
 [204] "John McDonough Senior High New Orleans LA"                             
 [205] "Springfield High School Springfield OR"                                
 [206] "Lorain High School Lorain OH"                                          
 [207] "Valley High School Las Vegas NV"                                       
 [208] "Deer Creek Junior High School Littleton CO"                            
 [209] "Forest Park Senior High School Baltimore MD"                           
 [210] "Russell High School East Point GA"                                     
 [211] "Anniston High School Anniston FL"                                      
 [212] "Garside Junior High School Las Vegas NV"                               
 [213] "Lake Braddock Secondary School Burke VA"                               
 [214] "South West Middle School Pine Bluff AR"                                
 [215] "Elmont Memorial High School Elmont NY"                                 
 [216] "Cooley High School Detroit MI"                                         
 [217] "Wingfield High School Jackson MS"                                      
 [218] "Huntsville High School Huntsville AL"                                  
 [219] "Finney High School Detroit MI"                                         
 [220] "John H. Reagan High School Houston TX"                                 
 [221] "Parkway South Middle School Baldwin MO"                                
 [222] "William H. Lemmel Middle School Baltimore MD"                          
 [223] "West Ward School Coleman TX"                                           
 [224] "DeLand High School DeLand FL"                                          
 [225] "Riverdale High School Murfreesboro TN"                                 
 [226] "Albuquerque High School Alburquerque NM"                               
 [227] "Santa Maria InCornata-Santa Lucia School Chicago IL"                   
 [228] "Beaumont High School St. Louis MO"                                     
 [229] "Lake Highland High School Dallas TX"                                   
 [230] "Brentwood High School New York NY"                                     
 [231] "North Miami Senior High School Miami FL"                               
 [232] "Mansfield Senior High School Mansfield OH"                             
 [233] "Greater Johnstown High School Johnstown PA"                            
 [234] "Henry Ford High School Detroit MI"                                     
 [235] "Manuel Dominguez High School Compton CA"                               
 [236] "Walbrook High School Baltimore MD"                                     
 [237] "Coleman Junior High School Greenville MS"                              
 [238] "Temple High School Temple TX"                                          
 [239] "Compton High School Los Angeles CA"                                    
 [240] "Carver Vocational-Technical Senior High Baltimore MD"                  
 [241] "Highland Park High School Highland Park MI"                            
 [242] "James G. Blaine Elementary School Chicago IL"                          
 [243] "Harlem Park Junior High School Baltimore MD"                           
 [244] "Crawfordsville High School Crawfordsville IN"                          
 [245] "Boylan Central Catholic High School Rockford IL"                       
 [246] "Lake Clifton Senior HIgh School Baltimore MD"                          
 [247] "Central High School Louisville KY"                                     
 [248] "Sharpstown High School Houston TX"                                     
 [249] "49th Street Elementary School Los Angeles CA"                          
 [250] "Clinton High School Clinton LA"                                        
 [251] "Precious Blood School Detroit MI"                                      
 [252] "Rose Hill Magnolia Elementary School Wallace NC"                       
 [253] "C.M. Russell High School Great Falls MT"                               
 [254] "Southeast Polk High School Pleasant Hill IA"                           
 [255] "Booker T. Washington High School Houston TX"                           
 [256] "Norco High School Norco CA"                                            
 [257] "Cleveland Heights High School Cleveland Heights OH"                    
 [258] "Mumford High School Detroit MI"                                        
 [259] "Booker T. Washington High School Shreveport LA"                        
 [260] "Richland High School North Richland Hills TX"                          
 [261] "Millsap Elementary School Houston TX"                                  
 [262] "Wyoming Area High School Exeter PA"                                    
 [263] "Central High School Detroit MI"                                        
 [264] "Southeastern High School Detroit MI"                                   
 [265] "West Elementary School Bus Celina OH"                                  
 [266] "Pendleton High School Pendleton SC"                                    
 [267] "East Ascension High School Gonzales LA"                                
 [268] "Millford Mill High School Rockdale MD"                                 
 [269] "Edwardsville High School St. Louis MO"                                 
 [270] "Arlington High School Arlington TX"                                    
 [271] "Goddard Junior High School Goddard KS"                                 
 [272] "St. Gregory's High School Boston MA"                                   
 [273] "A.I. Prince Technical High School Hartford CT"                         
 [274] "MacArthur Senior High School Aldine TX"                                
 [275] "Parrott Junior High School Brookville FL"                              
 [276] "Highland Park High School Highland Park TX"                            
 [277] "East End Middle School (bus) Richmond VA"                              
 [278] "Wheatley High School Houston TX"                                       
 [279] "Langham Creek High School Cypress TX"                                  
 [280] "Trotwood-Madison Senior High Trotwood OH"                              
 [281] "Lake Clifton High School Baltimore MD"                                 
 [282] "Murray-Wright High School Detroit MI"                                  
 [283] "Southern Hills Joint Vocational High School Georgetown OH"             
 [284] "Spanaway Junior High School Spanaway WA"                               
 [285] "Chelsea School Birmingham AL"                                          
 [286] "Concord High School Concord NH"                                        
 [287] "Archbishop Ryan High School for boys Philadelphia PA"                  
 [288] "Portland Junior High School Portland CT"                               
 [289] "Northern High School Durham NC"                                        
 [290] "Vanguard Junior High School Los Angeles CA"                            
 [291] "Lake Clifton High School Baltimore MD"                                 
 [292] "Boyet Junior High School Slidell LA"                                   
 [293] "Thornridge High School Dolton IL"                                      
 [294] "Charles Drew Middle School Miami FL"                                   
 [295] "Senath-Hornersville High School Senath MO"                             
 [296] "Pine Forest High School Fayetteville NC"                               
 [297] "Carver High School Atlanta GA"                                         
 [298] "Cokeville Elementary School Cokeville WY"                              
 [299] "Maplewood High School Nashville TN"                                    
 [300] "Fairfax High School Los Angeles CA"                                    
 [301] "Benicia High School Benicia CA"                                        
 [302] "Monrovia High School Monrovia CA"                                      
 [303] "South Oak Cliff High School Dallas TX"                                 
 [304] "Fergus High School Lewistown MT"                                       
 [305] "Los Angeles High School Los Angeles CA"                                
 [306] "Redford High School Detroit MI"                                        
 [307] "Dardanelle High School Dardanelle AR"                                  
 [308] "Orme School Mayer AZ"                                                  
 [309] "Mount Tom Country Day School New Rochelle NY"                          
 [310] "Dekalb High School De Kalb MO"                                         
 [311] "Riverside High School El Paso TX"                                      
 [312] "Panorama Elementary School Santa Ana CA"                               
 [313] "Murray-Wright High School Detroit MI"                                  
 [314] "Grant High School Portland OR"                                         
 [315] "Pike Township High School Indianapolis IN"                             
 [316] "Leto High School Tampa FL"                                             
 [317] "MacAuthur Junior High Jonesboro AR"                                    
 [318] "Oak Lawn Community High School Oak Lawn IL"                            
 [319] "Illiana Christian High School Lansing IL"                              
 [320] "DuSable High School Chicago IL"                                        
 [321] "Southwood Elementary School Kingston NC"                               
 [322] "Southwestern High School Detroit MI"                                   
 [323] "Clearwater High School Clearwater FL"                                  
 [324] "Perales Elementary School San Antonio TX"                              
 [325] "Englewood High School Jacksonville FL"                                 
 [326] "East New York High School of Transit Technology New York NY"           
 [327] "Grady Vocational-Technical School Brighton Beach NY"                   
 [328] "Mayde Creek High School Katy TX"                                       
 [329] "Springfield High School Springfield PA"                                
 [330] "Gaither High School Tampa FL"                                          
 [331] "Crawford County Joint Vocational Technical School Meadville PA"        
 [332] "Simsboro High School Ruston LA"                                        
 [333] "Reagan High School Austin TX"                                          
 [334] "West End Christian Elementary School Tuscaloosa AL"                    
 [335] "Pinellas Park High School Largo FL"                                    
 [336] "Bristol High School Bristol RI"                                        
 [337] "Lessenger Junior High Detroit MI"                                      
 [338] "Cajon High School San Bernadino CA"                                    
 [339] "Travis High School Austin TX"                                          
 [340] "Martin Luther King High School Chicago IL"                             
 [341] "Fort Myers Middle School Fort Myers FL"                                
 [342] "Hubbard Woods Elementary School Winnetka IL"                           
 [343] "Public School 67 Bronx NY"                                             
 [344] "Wingfield High School Jackson MS"                                      
 [345] "Joy Middle School Detroit MI"                                          
 [346] "Aiea High School Oahu HI"                                              
 [347] "Siefert Elementary School Milwaukee WI"                                
 [348] "Lanier High School Jackson MS"                                         
 [349] "Central High School Detroit MI"                                        
 [350] "West Franklin Elementary School Anderson SC"                           
 [351] "Lincoln High School Dallas TX"                                         
 [352] "Garinger High School Charlotte NC"                                     
 [353] "Glen Hills High School Augusta GA"                                     
 [354] "Moses Montefoire Public School Chicago IL"                             
 [355] "Oakland Elementary School Greenwood SC"                                
 [356] "Mascotte Elementary School Mascotte FL"                                
 [357] "Istrouma Senior High School Baton Rouge LA"                            
 [358] "J. E. B. Stuart Junior High School (bus) Jacksonville FL"              
 [359] "Edmondson Westside Senior High School Baltimore MD"                    
 [360] "Most Pure Heart of Mary School Mobile AL"                              
 [361] "Southwestern Senior High School Baltimore MD"                          
 [362] "Dick Dowling Elementary School Port Arthur TX"                         
 [363] "Paxon High School Jacksonville FL"                                     
 [364] "Glendale Intermediate School Salt Lake City UT"                        
 [365] "Abilene Cooper High School Abilene TX"                                 
 [366] "Atlantic Shores Christian School Virginia Beach VA"                    
 [367] "Henderson Junior High School Little Rock AR"                           
 [368] "Cleveland Elementary School Stockton CA"                               
 [369] "Woodrow Wilson HIgh School Washington DC"                              
 [370] "Thomas Jefferson Junior High School Kearns UT"                         
 [371] "Wirt High School Gary IN"                                              
 [372] "A. Maceo Smith High School Dallas TX"                                  
 [373] "Dysart High School El Mirage AZ"                                       
 [374] "Jackson County High School McKee KY"                                   
 [375] "Loara High School Anaheim CA"                                          
 [376] "Oliver Wendell Holmes Middle School Dallas TX"                         
 [377] "Alfred E. Smith High School New York NY"                               
 [378] "Workman Junior High School Arlington TX"                               
 [379] "Channel Islands High School Oxnard CA"                                 
 [380] "Caddo Magnet High School Shreveport LA"                                
 [381] "W. W. Samuell High School Dallas TX"                                   
 [382] "Serra Catholic High School bus McKeesport PA"                          
 [383] "Chester High School Chester SC"                                        
 [384] "Central High School Providence RI"                                     
 [385] "Taft High School Cincinnati OH"                                        
 [386] "New Utrecht High School Brooklyn NY"                                   
 [387] "Skyline High School Dallas TX"                                         
 [388] "Mount Pleasant High School East San Jose CA"                           
 [389] "Hickman County High School Centerville TN"                             
 [390] "Sunrise Elementary School Fort Worth TX"                               
 [391] "Myers Park High School Charlotte NC"                                   
 [392] "W. H. Adamson High School Dallas TX"                                   
 [393] "Eldorado High School Las Vegas NV"                                     
 [394] "Sam Houston High School San Antonio TX"                                
 [395] "Legion Field Statium (high school game) Birmingham AL"                 
 [396] "W. H. Adamson High School Dallas TX"                                   
 [397] "Charlestown High School Charlestown IN"                                
 [398] "Naaman Forest High School Garland TX"                                  
 [399] "Salmen High School Slidell LA"                                         
 [400] "Richardson High School Richardson TX"                                  
 [401] "Hood Middle School Dallas TX"                                          
 [402] "Booker T. Washington High School New Orleans LA"                       
 [403] "Selma High School Selma AL"                                            
 [404] "Woodmont High School Piedmont SC"                                      
 [405] "Garinger High School Charlotte NC"                                     
 [406] "Northwest High School Rock Hill SC"                                    
 [407] "Ralph J. Bunche Middle School Compton CA"                              
 [408] "Humphrey's County High School Belzoni MS"                              
 [409] "Franklin Alternative Middle School Columbus OH"                        
 [410] "Coronado Middle School Kansas City KS"                                 
 [411] "School of Choice Pahokee FL"                                           
 [412] "Robert A. Millikan Junior High School Sherman Oaks CA"                 
 [413] "Westchester High School Los Angeles CA"                                
 [414] "Enterprise Middle School Compton CA"                                   
 [415] "Madison High School Houston TX"                                        
 [416] "Woodson High School Chicago IL"                                        
 [417] "Crosby High School Crosby TX"                                          
 [418] "Spring Woods High School (bus) Houston TX"                             
 [419] "Dorsey High School Los Angeles CA"                                     
 [420] "Roosevelt High School Los Angeles CA"                                  
 [421] "James Monroe High School Bronx NY"                                     
 [422] "Madison Park High School Roxbury MA"                                   
 [423] "Genevieve Sparks Elementary School Pasadena TX"                        
 [424] "Woodruff High School Woodruff SC"                                      
 [425] "Monadnock Regional High School Swanzey NH"                             
 [426] "Oak Cliff High School Dallas TX"                                       
 [427] "Walter L. Cohen Senior High School New Orleans LA"                     
 [428] "Ysleta High School El Paso TX"                                         
 [429] "Milby High School Houston TX"                                          
 [430] "Thomas Jefferson High School Brooklyn NY"                              
 [431] "Whiteville High School Whiteville NC"                                  
 [432] "Francis W. Gregory Junior High School Gentilly LA"                     
 [433] "Francis W. Gregory Junior High School Gentilly LA"                     
 [434] "Douglass High School Oklahoma City OK"                                 
 [435] "Booker T. Washington High School Norfolk VA"                           
 [436] "Thomas Jefferson High School Brooklyn NY"                              
 [437] "Hamilton Middle School Obetz OH"                                       
 [438] "O. Perry Walker High School Algiers LA"                                
 [439] "Fort Myers High School Fort Myers FL"                                  
 [440] "Lincoln High School Dallas TX"                                         
 [441] "Lindhurst High School Olivehurst CA"                                   
 [442] "Huntsville Junior High School Huntsville TX"                           
 [443] "Silverado Middle School Napa CA"                                       
 [444] "Venice High School Los Angeles CA"                                     
 [445] "Merced High School Merced CA"                                          
 [446] "Palo Duro High School Amarillo TX"                                     
 [447] "Hiram Johnson High School Sacramento CA"                               
 [448] "Hollibrook Elementary School Houston TX"                               
 [449] "Desert View High School Tucson AZ"                                     
 [450] "Evander Childs High School Bronx NY"                                   
 [451] "Finney High School Detroit MI"                                         
 [452] "Marcus Garvey Academy Detroit MI"                                      
 [453] "Mumford High School Detroit MI"                                        
 [454] "Sherman Elementary School Chicago IL"                                  
 [455] "Langham Creek High School Cypress TX"                                  
 [456] "Fairfield High School Birmingham AL"                                   
 [457] "Tilden High School Chicago IL"                                         
 [458] "Robert E. Lee High School Montgomery AL"                               
 [459] "Orr High School Chicago IL"                                            
 [460] "Woodson High School Chicago IL"                                        
 [461] "Walton High School Walton NY"                                          
 [462] "Brentwood High School Brentwood NY"                                    
 [463] "Norland Senior High School Miami FL"                                   
 [464] "East Carter High School Grayson KY"                                    
 [465] "Fairfax High School Los Angeles CA"                                    
 [466] "Redmond Junior High School Redmond WA"                                 
 [467] "Amityville High School Amityville NY"                                  
 [468] "Clayton High School Atlanta GA"                                        
 [469] "Washington-Dix Street Academy (High School) Washington DC"             
 [470] "Middle River Middle School Middle River MN"                            
 [471] "Reseda High School Los Angeles CA"                                     
 [472] "Gloucester High School Gloucester MA"                                  
 [473] "Dozier Middle School Denbigh VA"                                       
 [474] "Harlem High School Harlem GA"                                          
 [475] "Sumner High School St. Louis MO"                                       
 [476] "Grant High School Sacramento CA"                                       
 [477] "Ford Middle School Acushnet MA"                                        
 [478] "Grant High School Sacramento CA"                                       
 [479] "Mount Tahoma High School Tacoma WA"                                    
 [480] "Nimitz High School Irving TX"                                          
 [481] "Upper Perkiomen High School Pennsburg PA"                              
 [482] "Francis T. Nicholls High School New Orleans LA"                        
 [483] "Dorsey High School Los Angeles CA"                                     
 [484] "Theodore Roosevelt High School New York NY"                            
 [485] "Harper High School Atlanta GA"                                         
 [486] "Junction City High School Junction City KS"                            
 [487] "Roosevelt High School Dallas TX"                                       
 [488] "Roosevelt High School Chicago IL"                                      
 [489] "Central Junior High School Sheridan WY"                                
 [490] "Downers South High School Downers Grove IL"                            
 [491] "Weatherless Elementary School Washington DC"                           
 [492] "Dover High School New Castle DE"                                       
 [493] "J. H. Johnson Junior High School Washington DC"                        
 [494] "Sullivan High School Chicago IL"                                       
 [495] "New Britain High School New Britain CT"                                
 [496] "Terry Parker High School Jacksonville FL"                              
 [497] "Bay Springs High School Bay Springs MS"                                
 [498] "Ridgely Elementary School Springfield IL"                              
 [499] "Wauwatosa West High School Wauwatosa WI"                               
 [500] "New Britain High School New Britain CT"                                
 [501] "Beach High School Savannah GA"                                         
 [502] "Chatsworth High School San Fernando Valley CA"                         
 [503] "Chelsea High School Chelsea MI"                                        
 [504] "Los Altos High School Hacienda Heights CA"                             
 [505] "Kennard High School Kennard TX"                                        
 [506] "Eau Claire High School Columbia SC"                                    
 [507] "Paul Lawrence Dunbar High School Washington DC"                        
 [508] "Eliot Junior High School Washington DC"                                
 [509] "Washington Elementary School San Jose CA"                              
 [510] "Whitman Middle School Seattle WA"                                      
 [511] "Osborn High School Detroit MI"                                         
 [512] "Spartanburg High School Spartanburg SC"                                
 [513] "Kemper Military School and College Boonville MO"                       
 [514] "Ensley High School Birmingham AL"                                      
 [515] "Eastern High School Washington DC"                                     
 [516] "Goose Creek High School Charleston SC"                                 
 [517] "Ballard High School Seattle WA"                                        
 [518] "Etowah High School Cherokee County GA"                                 
 [519] "McNeil High School Austin TX"                                          
 [520] "Largo High School Upper Marlboro MD"                                   
 [521] "Margaret Leary Elementary School Butte MT"                             
 [522] "49th Street Elementary School Los Angeles CA"                          
 [523] "Eliot Junior High School Washington DC"                                
 [524] "Dickinson Middle School South Bend IN"                                 
 [525] "J.T. Moore Middle School Nashville TN"                                 
 [526] "North Miami High School North Miami FL"                                
 [527] "LaSalle High School South Bend IN"                                     
 [528] "Lakeland Regional High School Wanaque NJ"                              
 [529] "Larry A. Ryle High School Union KY"                                    
 [530] "Manchester Elementary School Manchester PA"                            
 [531] "Ottumwa High School Ottumwa IA"                                        
 [532] "Hollywood High School Los Angeles CA"                                  
 [533] "Sweet Home High School Albany NY"                                      
 [534] "Locke High School Los Angeles CA"                                      
 [535] "Lebanon Union High School Lebanon OR"                                  
 [536] "Grimsley High School Greensboro NC"                                    
 [537] "Hubbard High School Chicago IL"                                        
 [538] "Aliso Niguel High school Aliso Veijo CA"                               
 [539] "Thomas Jefferson Elementary School San Leandro CA"                     
 [540] "Wickliffe Middle School Wickliffe OH"                                  
 [541] "West Delaware High School Manchester IA"                               
 [542] "Wilbur Cross High School New Haven CT"                                 
 [543] "Stadium High School Tacoma WA"                                         
 [544] "Cardozo Senior High School Washington DC"                              
 [545] "Palm Beach Gardens High School Palm Beach Gardens FL"                  
 [546] "Garfield High School Seattle WA"                                       
 [547] "Sacred Heart Middle School Redlands CA"                                
 [548] "Spingarn High School Washington DC"                                    
 [549] "Jordan High School Long Beach CA"                                      
 [550] "Chadron Middle School Scottsbluff NE"                                  
 [551] "Pershing High School Detroit MI"                                       
 [552] "Redford High School Detroit MI"                                        
 [553] "Lake Worth High School Lake Worth FL"                                  
 [554] "Memorial Middle School Laredo TX"                                      
 [555] "Cypress Junior High School Memphis TN"                                 
 [556] "Olathe North High School Olathe KS"                                    
 [557] "George Rogers Clark High School Winchester KY"                         
 [558] "Blount High School Prichard AL"                                        
 [559] "Tavares Middle School Tavares FL"                                      
 [560] "Blackville-Hilda High School Blackville SC"                            
 [561] "Lake Howell High School Casselberry FL"                                
 [562] "John F. Kennedy High School Richmond VA"                               
 [563] "Blue Lake Elementary School (bus) Miami Beach FL"                      
 [564] "Richland High School Lynnville TN"                                     
 [565] "Thomas A. Edison Vocational and Technical High School New York NY"     
 [566] "Girard High School Girard PA"                                          
 [567] "Winston Education Center Washington DC"                                
 [568] "East High School Memphis TN"                                           
 [569] "Frontier Middle School Moses Lake WA"                                  
 [570] "Mid-Peninsula High School Menlo Park CA"                               
 [571] "Jenkins High School Savannah GA"                                       
 [572] "Beaumont High School (bus) St. Louis MO"                               
 [573] "North Stanley High School New Longdon NC"                              
 [574] "Swainston Middle School Las Vegas NV"                                  
 [575] "Talladega High School Talladega AL"                                    
 [576] "McKinley High School Washington DC"                                    
 [577] "Bingham Middle School Taylorsville UT"                                 
 [578] "Colton High School Colton CA"                                          
 [579] "West Valley High School Hemet CA"                                      
 [580] "John Marshall High School Los Angeles CA"                              
 [581] "Dekalb Alternative School Decatur GA"                                  
 [582] "Smedley Elementary School Philadelphia PA"                             
 [583] "St. Bernard High School Playa Del Rey CA"                              
 [584] "Jacksonville High School bus Sherwood AR"                              
 [585] "Sumner High School St. Louis MO"                                       
 [586] "Highlands High School Sacramento CA"                                   
 [587] "Crown Heights High School New York NY"                                 
 [588] "Conniston Middle School West Palm Beach FL"                            
 [589] "Wingfield High School Jackson MS"                                      
 [590] "Morris High School Bronx NY"                                           
 [591] "Samuel Gompers High School Bronx NY"                                   
 [592] "Bethel Regional High School Bethel AK"                                 
 [593] "First Coast High School Jacksonville FL"                               
 [594] "Rancho High School Las Vegas NV"                                       
 [595] "Pershing High School Detroit MI"                                       
 [596] "Maria Del Rey Junior High School Mar Vista CA"                         
 [597] "John Marshall High School Los Angeles CA"                              
 [598] "City-as-School High School New York NY"                                
 [599] "Northwestern High School Miami FL"                                     
 [600] "Dunbar High School Dayton OH"                                          
 [601] "Jefferson Davis High School Montgomery AL"                             
 [602] "Pearl High School Pearl MS"                                            
 [603] "Moore West Junior High School Oklahoma City OK"                        
 [604] "Wallace High School Gary IN"                                           
 [605] "Lakeview Centennial High School Garland TX"                            
 [606] "Lincoln Middle School Palmetto FL"                                     
 [607] "McClymonds High School Oakland CA"                                     
 [608] "John Glenn High School Norwalk CA"                                     
 [609] "Ribault High School Jacksonville FL"                                   
 [610] "Creekside Elementary School Sacramento CA"                             
 [611] "Heath High School West Paducah KY"                                     
 [612] "Stamps High School Stamps AR"                                          
 [613] "Hoboken High School Hoboken NJ"                                        
 [614] "Reed City High School Reed City MI"                                    
 [615] "Marshall High School Fairfax VA"                                       
 [616] "Westside Middle School Jonesboro AR"                                   
 [617] "Coldwater High School Coldwater MI"                                    
 [618] "Fernando Rivera Middle School Daly City CA"                            
 [619] "Grey Culbreth Middle School Chapel Hill NC"                            
 [620] "Oakfield Middle School Oakfield WI"                                    
 [621] "Culver City High School Los Angeles CA"                                
 [622] "Parker Middle School Edinboro PA"                                      
 [623] "Pardeeville Elementary School Pardeeville WI"                          
 [624] "Philadelphia Elementary School Pomona CA"                              
 [625] "North Miami Senior High School Miami FL"                               
 [626] "Public School 18 Buffalo NY"                                           
 [627] "Lincoln County High School Fayetteville TN"                            
 [628] "Thurston High School Springfield OR"                                   
 [629] "Onalaska High School Onalaska WA"                                      
 [630] "Rialta High School Rialto CA"                                          
 [631] "Washington Middle School Pasadena CA"                                  
 [632] "Stranahan High School Ft. Lauderdale FL"                               
 [633] "Armstrong High School Richmond VA"                                     
 [634] "Herbert Hoover High School Glendale CA"                                
 [635] "North Miami High School Miami FL"                                      
 [636] "Leesburg High School Leesburg FL"                                      
 [637] "Martin Luther King High School Philadelphia PA"                        
 [638] "Hancock Middle High School Hancock NY"                                 
 [639] "Ernie Elementary School Gary IN"                                       
 [640] "Ben Davis Junior High School Indianapolis IN"                          
 [641] "Central High School Carrollton GA"                                     
 [642] "Harry S. Truman High School New York NY"                               
 [643] "Richland High School North Richland Hills TX"                          
 [644] "Ombudsman Educational Service Center Elgin IL"                         
 [645] "Jefferson-Todd Educational Center Purvis MS"                           
 [646] "Niles West High School Skokie IL"                                      
 [647] "Notus Jr. Sr. High School Notus ID"                                    
 [648] "Columbine High School Littleton CO"                                    
 [649] "Scotlandville Middle School Baton Rouge LA"                            
 [650] "Martin Luther King Jr. Middle School Atlanta GA"                       
 [651] "Heritage High School Conyers GA"                                       
 [652] "Jasper County High School Monticello GA"                               
 [653] "Santa Teresa High School San Jose CA"                                  
 [654] "Egypt Lake Elementary School Tampa FL"                                 
 [655] "John Bartram High School Philadelphia City SD"                         
 [656] "Clark High School Las Vegas NV"                                        
 [657] "San Fernando High School Pacoima CA"                                   
 [658] "Guyan Valley High School Branchland WV"                                
 [659] "Martin Luther King High School Philadelphia PA"                        
 [660] "Dickinson High School Dickinson TX"                                    
 [661] "Deming Middle School Deming NM"                                        
 [662] "Fort Gibson Middle School Fort Gibson OK"                              
 [663] "Bartlett High School Anchorage AK"                                     
 [664] "Albuquerque High School Albuquerque NM"                                
 [665] "Ridgewood High School New Port Richey FL"                              
 [666] "Erwin High School Asheville NC"                                        
 [667] "Alicia Reyes Elementary School Merced CA"                              
 [668] "South High School Omaha NE"                                            
 [669] "Penn Wood East Junior High School Yeadon PA"                           
 [670] "Duke Ellington Elementary School Chicago IL"                           
 [671] "Buell Elementary School Flint MI"                                      
 [672] "Beach High School Savannah GA"                                         
 [673] "McKinley Elementary School Lisbon OH"                                  
 [674] "Hugo High School Hugo OK"                                              
 [675] "La Cima Middle School Tucson AZ"                                       
 [676] "Thomas Jefferson High School Denver CO"                                
 [677] "Carmichael Elementary School Sierra Vista AZ"                          
 [678] "Lake Worth Middle School Lake Worth FL"                                
 [679] "Dimmitt Middle School Renton WA"                                       
 [680] "Timken Senior High School Canton OH"                                   
 [681] "Bidwell Porter Elementary School Bidwell OH"                           
 [682] "Longfellow Elementary School Rock Island IL"                           
 [683] "Mount Healthy North Junior High Mount Healthy OH"                      
 [684] "Carter G. Woodson Middle School New Orleans LA"                        
 [685] "Minneapolis North High School Minneapolis MN"                          
 [686] "Pioneer Elementary School Glendale AZ"                                 
 [687] "Newman Smith High School Carrollton TX"                                
 [688] "Granada Hills High School Los Angeles CA"                              
 [689] "Junipero Serra High School San Diego CA"                               
 [690] "Richmond High School Richmond CA"                                      
 [691] "Norland Elementary School Miami FL"                                    
 [692] "Balboa High School San Francisco CA"                                   
 [693] "Hueneme High School Oxnard CA"                                         
 [694] "Lake Clifton Eastern High School Baltimore MD"                         
 [695] "Osborn High School Detroit MI"                                         
 [696] "Hoover High School San Diego CA"                                       
 [697] "Santana High School Santee CA"                                         
 [698] "Largo High School Largo MD"                                            
 [699] "Bishop Neumann High School Williamsport PA"                            
 [700] "Kentwood High School Covington WA"                                     
 [701] "Granite Hills High School El Cajon CA"                                 
 [702] "Lew Wallace High School Gary IN"                                       
 [703] "Kleb Intermediate School Houston TX"                                   
 [704] "Wahluke High School Mattawa WA"                                        
 [705] "Monroe City Alternative Center Monroe LA"                              
 [706] "John Marshall High School Cleveland OH"                                
 [707] "Ennis High School Ennis TX"                                            
 [708] "Ousley Junior High School Arlington TX"                                
 [709] "Belmont High School Los Angeles CA"                                    
 [710] "Latonia Elementary School Covington KY"                                
 [711] "Lake Clifton Eastern High School Baltimore MD"                         
 [712] "Taylorsville High School Taylorsville UT"                              
 [713] "Redondo Union High School Redondo Beach CA"                            
 [714] "Benito Juarez Academy Siginaw MS"                                      
 [715] "Caro Learning Center Caro MI"                                          
 [716] "Friendswood Junior High School Friendswood TX"                         
 [717] "Raymond High School Jackson MS"                                        
 [718] "Martin Luther King, Jr. High School New York NY"                       
 [719] "Oley High School (bus) Oley PA"                                        
 [720] "Brock High School Brock TX"                                            
 [721] "Gardena High School Los Angeles CA"                                    
 [722] "Roosevelt High School Chicago IL"                                      
 [723] "John Barrett Middle School Carmichael CA"                              
 [724] "Leith Walk Elementary School Baltimore MD"                             
 [725] "Abramson High School New Orleans LA"                                   
 [726] "Page Middle School San Antonio TX"                                     
 [727] "C.M.Russell HIgh School Great Falls MT"                                
 [728] "Benjamin Tasker Middle School Bowie MD"                                
 [729] "Lincoln High School Jersey City NJ"                                    
 [730] "St. James Catholic School Liberty MO"                                  
 [731] "Ambler Avenue Elementary School Los Angeles CA"                        
 [732] "Scurry-Rosser High School Scurry TX"                                   
 [733] "Osborn High School Detroit MI"                                         
 [734] "Wind River Middle School Carson WA"                                    
 [735] "Englewood High School Chicago IL"                                      
 [736] "West Carter Middle School Olive Hill KY"                               
 [737] "Jenks High School Jenks OK"                                            
 [738] "Ranum High School Westminster CO"                                      
 [739] "Clayton Ridge High School Guttenberg IA"                               
 [740] "Northeast High School Meridian MS"                                     
 [741] "Rolling Hills Middle School Watsonville CA"                            
 [742] "Cardozo High School Washington DC"                                     
 [743] "John McDonogh High School New Orleans LA"                              
 [744] "Fair Park High School Shereveport LA"                                  
 [745] "Greenhill Middle School Addison TX"                                    
 [746] "Red Lion Area Junior High School Red Lion PA"                          
 [747] "Forest Hills High School Johnstown PA"                                 
 [748] "Rock L. Butler Middle School Wellsboro PA"                             
 [749] "Vicksburg High School Vicksburg MS"                                    
 [750] "Oklahoma Road Middle School Eldersburg MD"                             
 [751] "Charlestown High School Boston MA"                                     
 [752] "Lewis and Clark High School Spokane WA"                                
 [753] "Rocori High School Cold Spring MN"                                     
 [754] "Burns Middle School Lawndale NC"                                       
 [755] "Rio Cazadero High School Sacramento CA"                                
 [756] "Kenmore High School Akron OH"                                          
 [757] "Marion High School Marion LA"                                          
 [758] "Anacostia High School Washington DC"                                   
 [759] "Hightower High School Sugarland TX"                                    
 [760] "East Mecklenburg High School Charlotte NC"                             
 [761] "Fermi Elementary School Chicago IL"                                    
 [762] "Douglas High School Oklahoma City OK"                                  
 [763] "Carbondale Community High School Carbondale IL"                        
 [764] "Old Mill High School Millersville MD"                                  
 [765] "Colonia High School Woodbridge NJ"                                     
 [766] "Abess Park Elementary School East Arlington FL"                        
 [767] "Pomona High School Pomona CA"                                          
 [768] "Fay Galloway Elementary School Henderson NV"                           
 [769] "Ballou Senior High School Washington DC"                               
 [770] "Youens Elementary School Houston TX"                                   
 [771] "Fair Park High School Shreveport LA"                                   
 [772] "Columbia High School East Greenbush NY"                                
 [773] "T.M. Peirce Elementary School Philadelphia PA"                         
 [774] "Colonel White High School Dayton OH"                                   
 [775] "Gathway Christian Academy St. Martinville LA"                          
 [776] "Saledad Enrichment Action Charter High School Los Angeles CA"          
 [777] "Crescent Junior-Senior High School Joyce WA"                           
 [778] "Kashmere High School Houston TX"                                       
 [779] "Randallstown High School Randallstown MD"                              
 [780] "East Campus Educational Center Merced CA"                              
 [781] "West High School Salt Lake City UT"                                    
 [782] "Castlemont High School Oakland CA"                                     
 [783] "Huffman High School Birmingham AL"                                     
 [784] "Hamilton High School Memphis TN"                                       
 [785] "Proviso East High School Maywood IL"                                   
 [786] "Booker T. Washington High School New Orleans LA"                       
 [787] "Wirt High School Gary IN"                                              
 [788] "Jefferson Elementary School Grand Island NE"                           
 [789] "Newburyport High School Newburyport MA"                                
 [790] "Lakewood Elementary School Sunnyvale CA"                               
 [791] "Biggs High School Biggs CA"                                            
 [792] "Thurgood Marshall High School Baltimore MD"                            
 [793] "Tyrrell Elementary School Hayward CA"                                  
 [794] "Brunswick Elementary School Gary IN"                                   
 [795] "Parker High School Birmingham AL"                                      
 [796] "Battery Creek High School Beaufort SC"                                 
 [797] "Apopka Memorial Middle School Apopka FL"                               
 [798] "Terry Parker High School Jacksonville FL"                              
 [799] "Lakeside High School Spokane WA"                                       
 [800] "La Grange High School Lake Charles LA"                                 
 [801] "Richmond State School Richmond TX"                                     
 [802] "Murrell Dobbins Vocational-Technical High School North Philadelphia PA"
 [803] "Central High School Detroit MI"                                        
 [804] "Woodruff High School Peoria IL"                                        
 [805] "McNair High School Atlanta GA"                                         
 [806] "Bowen High School Chicago IL"                                          
 [807] "Stewart County High School (bus) Dover TN"                             
 [808] "Maplewood Comprehensive High School Nashville TN"                      
 [809] "Zaragoza Elementary School Dallas TX"                                  
 [810] "Leawood Elementary School Columbus OH"                                 
 [811] "Carrick High School Pittsburgh PA"                                     
 [812] "Locke High School Los Angeles CA"                                      
 [813] "O Perry Walker High School Algiers LA"                                 
 [814] "Red Lake Senior High School Red Lake MN"                               
 [815] "New Utrecht High School Brooklyn NY"                                   
 [816] "Fairly High School Memphis TN"                                         
 [817] "East High School Memphis TN"                                           
 [818] "Canton High School Canton TX"                                          
 [819] "Leon Godchaux Junior High School Reserve LA"                           
 [820] "Daniel E. Morgan Elementary School Cleveland OH"                       
 [821] "Berkner High School Richardson TX"                                     
 [822] "Highland Elementary School Lower Allen Township PA"                    
 [823] "Locust Elementary School Marengo IL"                                   
 [824] "Booker T. Washington High School Shreveport LA"                        
 [825] "Academia Ana Marie Sandoval Montessori School Denver CO"               
 [826] "Arlington High School Poughkeepsi NY"                                  
 [827] "Bangs Avenue Elementary School Asbury Park NJ"                         
 [828] "Weequahic High School Newark NJ"                                       
 [829] "Country Day High School Estate Concordia VI"                           
 [830] "Planatation Elementary School Bakersfield CA"                          
 [831] "Morrow High School Morrow GA"                                          
 [832] "Maury Middle School Dandridge TN"                                      
 [833] "Dimond High School Anchorage AK"                                       
 [834] "Sojourner Truth High School Jacksonville FL"                           
 [835] "Harlan Community Academy High School Chicago IL"                       
 [836] "Saginaw High School Saginaw MI"                                        
 [837] "Farmington High School Farmington MI"                                  
 [838] "Samula Tilden High School New York NY"                                 
 [839] "San Gorgonio High School San Bernardino CA"                            
 [840] "Saginaw High School Saginaw MI"                                        
 [841] "Birney Elementary School Fresno CA"                                    
 [842] "Annapolis High School Annapolis MD"                                    
 [843] "Farmingdale High School Farmingdale NY"                                
 [844] "Campbell County High School Jacksboro, TN TN"                          
 [845] "Parkway Academy Charter High School (bus) Miramar FL"                  
 [846] "Irving Middle School San Antonio TX"                                   
 [847] "Boston Day and Evening Academy (High School) Roxbury MA"               
 [848] "Santiago High School Garden Grove FL"                                  
 [849] "Lincoln High School Jersey City NJ"                                    
 [850] "Mount Pleasant High School Wilmington DE"                              
 [851] "Mary McLeod Bethune Academy Milwaukee WI"                              
 [852] "Milwee Middle School Longwood FL"                                      
 [853] "Osborn High School Detroit MI"                                         
 [854] "Pinson Valley High School Pinson AL"                                   
 [855] "Passmore Elementary School Alvin TX"                                   
 [856] "Indian River High School Chesapeake VA"                                
 [857] "Fred Moodry Middle School Anaconda MT"                                 
 [858] "Withrow High School Cincinnati OH"                                     
 [859] "Will C. Wood High School Vacaville CA"                                 
 [860] "Lakeview Centennial High School Garland TX"                            
 [861] "C. M. Russell High School Great Falls MT"                              
 [862] "Longfellow Elementary School (bus) Compton CA"                         
 [863] "William Penn High School New Castle DE"                                
 [864] "West York Area High School York PA"                                    
 [865] "Westinghouse High School Pittsburgh PA"                                
 [866] "Roseburg High School Roseburg OR"                                      
 [867] "I.S. 89 Middle School New York NY"                                     
 [868] "Pine Middle School Reno NV"                                            
 [869] "Roosevelt Senior High School Washington DC"                            
 [870] "Westbury High School (bus) Houston TX"                                 
 [871] "East Chapel Hill High School Chapel Hill NC"                           
 [872] "Parkway Academy Miramar FL"                                            
 [873] "Butch Fork High School Irmo SC"                                        
 [874] "Northampton Area Senior High School Northampton PA"                    
 [875] "Venice High School Los Angeles CA"                                     
 [876] "Wirt High School Gary IN"                                              
 [877] "Pershing High School Detroit MI"                                       
 [878] "Young Middle Magnet School Tampa FL"                                   
 [879] "J. T. Alton Middle School Vine Grove KY"                               
 [880] "Mendez Middle School Austin TX"                                        
 [881] "South High School Youngstown OH"                                       
 [882] "Lyman Hall Elementary School Hinesville GA"                            
 [883] "Castle High School Newburgh IN"                                        
 [884] "Essex Elementary School Essex Junction VT"                             
 [885] "Anacostia Senior High School Washington DC"                            
 [886] "Orange High School Hillsborough NC"                                    
 [887] "Oxford High School Oxford AL"                                          
 [888] "Kingsbury Middle School Memphis TN"                                    
 [889] "South Hills High School Fort Worth TX"                                 
 [890] "Westminster Christian Academy Creve Coeur MO"                          
 [891] "Cardozo High School Washington DC"                                     
 [892] "Platte Canyon High School Bailey CO"                                   
 [893] "Weston High School Cazenovia WI"                                       
 [894] "West Nickel Mines School Nickel Mines PA"                              
 [895] "Memorial Middle School Joplin MO"                                      
 [896] "Ponoma Middle School Pomona NY"                                        
 [897] "Grove Park Elementary School Baltimore MD"                             
 [898] "Seven Lakes High School Katy TX"                                       
 [899] "Halls High School Knoxville TN"                                        
 [900] "Lionel Wilson College Prep School Oakland CA"                          
 [901] "Sammye E. Coan Middle School Atlanta GA"                               
 [902] "Jones Senior High School Trenton NC"                                   
 [903] "Northwest High School Omaha NE"                                        
 [904] "Clemente High School Chicago IL"                                       
 [905] "Springfield Township High School Springfield Township PA"              
 [906] "Bangor Area High School Bangor PA"                                     
 [907] "McGuffey High School Claysville PA"                                    
 [908] "Westover High School Fayetteville NC"                                  
 [909] "Henry Foss High School Tacoma WA"                                      
 [910] "Northwestern High School Detroit MI"                                   
 [911] "Robert A. Taft Information Technology High School Cincinnati OH"       
 [912] "Western High School Las Vegas NV"                                      
 [913] "Grant High School Van Nuys CA"                                         
 [914] "William L.Sayre High School Philadelphia PA"                           
 [915] "Harbin County High School Savannah TN"                                 
 [916] "Hillcrest High School Country Club Hills IL"                           
 [917] "Paxon Middle School Jacksonville FL"                                   
 [918] "Crook County High School Prineville OR"                                
 [919] "Stephen F. Austin Middle School Port Arthur TX"                        
 [920] "Slauson Middle School Azusa CA"                                        
 [921] "Clifton Elementary School Atlanta GA"                                  
 [922] "Greenville High School Greenville TX"                                  
 [923] "Herbert Henry Dow High School Midland MI"                              
 [924] "Centennial High School Compton CA"                                     
 [925] "East Ridge High School Chattanooga TN"                                 
 [926] "Union Park Elementary School Orlando FL"                               
 [927] "Sarah J. Rawson Elementary School Hartford CT"                         
 [928] "Myrtle Beach High School Myrtle Beach SC"                              
 [929] "Chicago Vocational Career Academy Chicago IL"                          
 [930] "Springwater Trail High School Gresham OR"                              
 [931] "North Mecklenburg High School Huntersville NC"                         
 [932] "Gettysburg Elementary School Dayton OH"                                
 [933] "Tidehaven High School El Maton TX"                                     
 [934] "Henry Ford High School Detroit MI"                                     
 [935] "West Mesquite High School Mesquite TX"                                 
 [936] "Liberty Memorial Middle School Los Fresnos TX"                         
 [937] "Oak Haven Elementary School Coventry RI"                               
 [938] "Vandora Springs Elementary School Garner NC"                           
 [939] "North Garner Middle School Garner NC"                                  
 [940] "Broad River Elementary School Burton SC"                               
 [941] "David W. Carter High School Dallas TX"                                 
 [942] "Carter G. Woodson Elementary School Chicago IL"                        
 [943] "Mount Vernon Elementary School Newark NJ"                              
 [944] "Las Plumas High School Oroville CA"                                    
 [945] "SS> Simon and Jude Catholic School Phoenix AZ"                         
 [946] "Platt High School Meriden CT"                                          
 [947] "SuccessTech Academy Cleveland OH"                                      
 [948] "Manassas High School Memphis TN"                                       
 [949] "John Curtis Christian School River Ridge LA"                           
 [950] "Holland Patent Central High School Holland Patent NY"                  
 [951] "Barnard-White Middle School Union City CA"                             
 [952] "Hamilton High School Memphis TN"                                       
 [953] "Mitchell High School Memphis TN"                                       
 [954] "E.O. Green Junior High School Oxnard CA"                               
 [955] "Davidson High School Mobile AL"                                        
 [956] "Roosevelt High School Fresno CA"                                       
 [957] "Madison Parish High School Tallulah LA"                                
 [958] "Wallace Elementary School Kelso WA"                                    
 [959] "Lakota Middle School Federal Way WA"                                   
 [960] "Central High School Knoxville TN"                                      
 [961] "South High School Willoughby OH"                                       
 [962] "Mira Loma High School Sacramento CA"                                   
 [963] "George Washington Preparatory High School Athens CA"                   
 [964] "Henry Ford High School Detroit MI"                                     
 [965] "Vasquez High School Acto CA"                                           
 [966] "Prattville Christian Academy Prattville AL"                            
 [967] "Eliot Elementary School Gilroy CA"                                     
 [968] "Stockton Springs Elementary School Stockton Springs MA"                
 [969] "El Rio Elementary School Oxnard CA"                                    
 [970] "Bell High School Bell CA"                                              
 [971] "Dillard High School Fort Lauderdale FL"                                
 [972] "Thompson Valley High School Loveland CO"                               
 [973] "Desert Hills High School St. George UT"                                
 [974] "Cole Middle School Oakland CA"                                         
 [975] "Central Valley High School Ceres CA"                                   
 [976] "North Forest High School Houston TX"                                   
 [977] "O. A. Peters Elementary School Garden Grove CA"                        
 [978] "King City High School King City CA"                                    
 [979] "Shattuck St. Mary's Prep School Faribault MN"                          
 [980] "William Floyd High School Mastic Beach NY"                             
 [981] "Guy B. Teachey Elementary School Asheboro NC"                          
 [982] "Summerville High School Summerville SC"                                
 [983] "Largo Middle School Largo FL"                                          
 [984] "William H. Harrison Elementary School Philadelphia PA"                 
 [985] "Shuman Middle School Savannah GA"                                      
 [986] "Kennedy Elementary School Norman OK"                                   
 [987] "William Penn High School New Castle DE"                                
 [988] "Dunbar High School Chicago IL"                                         
 [989] "Perspectives Charter School Chicago IL"                                
 [990] "Beecher High School Mount Morris Township MI"                          
 [991] "Collins HIgh School Chicago IL"                                        
 [992] "East High School Erie PA"                                              
 [993] "Cahokia High School Cahokia IL"                                        
 [994] "Clayton High School Clayton NC"                                        
 [995] "Baker Elementary School El Monte CA"                                   
 [996] "School bus Zebulon NC"                                                 
 [997] "Central High School Detroit MI"                                        
 [998] "John Muir Elementary School Hayward CA"                                
 [999] "Brien McMahon High School Norwalk CT"                                  
[1000] "Robert Frost Elementary School Sioux Falls SD"                         
[1001] "Westover High School Fayetteville NC"                                  
[1002] "Ribault High School Jacksonville FL"                                   
[1003] "Cypress Ridge High School Houston TX"                                  
[1004] "Locke HIgh School Los Angeles CA"                                      
[1005] "Sheboygan High School Sheboygan WI"                                    
[1006] "Canandaigua Academy Canandaigua NY"                                    
[1007] "Larose-Cut Off Middle School Larose LA"                                
[1008] "International Studies Academy San Francisco CA"                        
[1009] "Aplington-Parkersburg High School Parkersburg IA"                      
[1010] "Westover High School Fayetteville NC"                                  
[1011] "Stamford Academy Stamford CT"                                          
[1012] "Virginia Randolph Community High School Glen Allen VA"                 
[1013] "Mattituck Junior-Senior High School Mattituck NY"                      
[1014] "Carolina Forest High School Conway SC"                                 
[1015] "Wilson High School Long Beach CA"                                      
[1016] "Hamilton High School (bus) West Philadelphia PA"                       
[1017] "Booker T. Washington High School Shreveport LA"                        
[1018] "Livington High School Livington AL"                                    
[1019] "Discovery Middle School Madison AL"                                    
[1020] "Inskip Elementary School Knoxville TN"                                 
[1021] "Deer Creek Middle School Littleton CO"                                 
[1022] "Binary Elementary School Tacoma WA"                                    
[1023] "Woodrow Wilson High School Portsmouth VA"                              
[1024] "South Gate High School South Gate CA"                                  
[1025] "Sullivan Central High School Blountville TN"                           
[1026] "Mumford High School Detroit MI"                                        
[1027] "Socastee High School Conway SC"                                        
[1028] "Alisal High School Salinas CA"                                         
[1029] "Kelly Elementary School Carlsbad CA"                                   
[1030] "Topeka West High School Topeka KS"                                     
[1031] "Marinette High School Marinette WI"                                    
[1032] "Aurora Central High School Aurora CO"                                  
[1033] "Crown Point School bus Crown Point IN"                                 
[1034] "Millard South High School Omaha NE"                                    
[1035] "Gardena High School Los Angeles CA"                                    
[1036] "Louisiana Schnell Elementary School Placerville CA"                    
[1037] "Martinsville West Middle School Martinsville IN"                       
[1038] "Worthing High School Houston TX"                                       
[1039] "Sheeler Charter High School Apopka FL"                                 
[1040] "Betsy Ross Elementary School Houston TX"                               
[1041] "Horizon Elementary School Everett WA"                                  
[1042] "Highlands Intermediate School Pearl City HI"                           
[1043] "Issaquah High School Seattle WA"                                       
[1044] "Garinger High School Charlotte NC"                                     
[1045] "Wilson High School Portland OR"                                        
[1046] "Cape Fear High School Fayetteville NC"                                 
[1047] "Harwell Middle School Edinburg TX"                                     
[1048] "Northern High School Flint MI"                                         
[1049] "Cummings Middle School Brownsville TX"                                 
[1050] "North Forest High School Houston TX"                                   
[1051] "Walpole Elementary School Walpole NH"                                  
[1052] "Armin Jahr Elementary School Bremerton WA"                             
[1053] "Chardon High School Chardon OH"                                        
[1054] "Episcopal School of Jacksonville Jacksonville FL"                      
[1055] "LeFlore High School Mobile AL"                                         
[1056] "Kirksey Middle School Rogers AR"                                       
[1057] "West View High School Avondale AZ"                                     
[1058] "Mary Scroggs Elementary School Chapel Hill NC"                         
[1059] "Nathaniel Greene Elementary School Pawtucket RI"                       
[1060] "Hamilton High School Memphis TN"                                       
[1061] "Banks County High School Homer GA"                                     
[1062] "Perry Hall High School Perry Hall MD"                                  
[1063] "Normal Community High School Normal IL"                                
[1064] "Stillwater Junior High School Stillwater OK"                           
[1065] "Fairmount Public School Fairmont ND"                                   
[1066] "Banner Academy South Chicago IL"                                       
[1067] "Spring Woods High School Houston TX"                                   
[1068] "Sandy Hook Elementary School Newtown CT"                               
[1069] "Apostolic Revival Center Christian School Fort Myers FL"               
[1070] "Taft Union High School Taft CA"                                        
[1071] "Osborn High School Detroit MI"                                         
[1072] "Price Middle School Atlanta GA"                                        
[1073] "Martin Luther King High School Detroit MI"                             
[1074] "Hillside Elementary School San Leandro CA"                             
[1075] "Grady High School Atlanta GA"                                          
[1076] "Davidson Middle School Southgate MI"                                   
[1077] "Temple High School Temple TX"                                          
[1078] "La Salle High School Cincinnati OH"                                    
[1079] "Tularosa Elementary School Tularosa NM"                                
[1080] "Ossie Ware Mitchell Middle School Birmingham AL"                       
[1081] "Redland Middle School Homestead FL"                                    
[1082] "Hidden Valley Elementary School Charlotte NC"                          
[1083] "Alexander W. Dreyfoos School of the Arts West Palm Beach FL"           
[1084] "Northwest High School Clarksville TN"                                  
[1085] "Ronald E. McNair Discovery Learning Academy Decatur GA"                
[1086] "Westside Elementary School Memphis TN"                                 
[1087] "North Panola High School Sardis MS"                                    
[1088] "Carver High School Winston-Salem NC"                                   
[1089] "Roosevelt High School Chicago IL"                                      
[1090] "New Gloucester High School Gray ME"                                    
[1091] "Winnisquam Regional School District Sanbornton NH"                     
[1092] "Agape Christian Academy Pine Hills FL"                                 
[1093] "Lanier High School Austin TX"                                          
[1094] "Sparks Middle School Sparks NV"                                        
[1095] "Newman Elementary School Chino CA"                                     
[1096] "Algona High School Algona IA"                                          
[1097] "Stephenson High School Lithonia GA"                                    
[1098] "Brashear High School Pittsburgh PA"                                    
[1099] "West Orange High School Winter Garden FL"                              
[1100] "Arapahoe High School Centennial CO"                                    
[1101] "Edison High School Fresno CA"                                          
[1102] "Liberty Technology Magnet High School Jackson TN"                      
[1103] "Hillhouse High School New Haven CT"                                    
[1104] "Berrendo Middle School Roswell NM"                                     
[1105] "King Elementary School Lancaster PA"                                   
[1106] "St. James High School Baton Rouge LA"                                  
[1107] "Delaware Valley Charter School Philadelphia PA"                        
[1108] "Rebound High School Carbondale IL"                                     
[1109] "President Theodore Roosevelt High Honolulu HI"                         
[1110] "Cesar Chavez High School Phoenix AZ"                                   
[1111] "North High School Des Moines IA"                                       
[1112] "Bend High School Bend OR"                                              
[1113] "Salisbury High School Salisbury NC"                                    
[1114] "Charles F. Brush High School Lyndhurt OH"                              
[1115] "Raytown Success Academy Raytown MI"                                    
[1116] "Madison Parish High School Tallulah LA"                                
[1117] "Academy of Knowledge Preschool Miami FL"                               
[1118] "Benjamin Banneker High School College Park GA"                         
[1119] "Unknown School (bus) Newark NJ"                                        
[1120] "D. H. Conley High School Greenville NC"                                
[1121] "Liberty Elementary School Columbus OH"                                 
[1122] "East English Village Preparatory Academy Detroit MI"                   
[1123] "Provo High School Provo UT"                                            
[1124] "St. Mary Catholic School Griffith IN"                                  
[1125] "Horizon Elementary School Everett WA"                                  
[1126] "John F. Kennedy High School Richmond CA"                               
[1127] "Clarke Street Elementary School Milwaukee WI"                          
[1128] "Reynolds High School Troutdale OR"                                     
[1129] "Kelly High School Benton MO"                                           
[1130] "Heather Ridge High School Fredrick MD"                                 
[1131] "Saunders Elementary School Newport News VA"                            
[1132] "Stellar Leadership Academy Miami FL"                                   
[1133] "Greenwood Lakes Middle School Lake Mary FL"                            
[1134] "Westbrook Elementary School Taylorsville UT"                           
[1135] "North High School Des Moines IA"                                       
[1136] "West High School Manchester NH"                                        
[1137] "Fern Creek Traditional High School Louisville KY"                      
[1138] "Albemarle High School Albemarle NC"                                    
[1139] "Langston Hughes High School Fairburn GA"                               
[1140] "A. Maceo Walker Middle School Memphis TN"                              
[1141] "Marysville Pilchuck High School Marysville WA"                         
[1142] "Lakewood Stadium (Mays High School Game) Atlanta GA"                   
[1143] "Miami Carol City High School Miami FL"                                 
[1144] "Rosemary Anderson High School Portland OR"                             
[1145] "Sunnyside Elementary School Pittsburgh PA"                             
[1146] "Godfrey Lee High School Wyoming MI"                                    
[1147] "Benton Elementary School Waterville ME"                                
[1148] "Wisconsin Lutheran High School Milwaukee WI"                           
[1149] "Vanguard High School Ocala FL"                                         
[1150] "Williamson High School Mobile AL"                                      
[1151] "Royal Live Oaks Academy Hardeeville SC"                                
[1152] "Hand in Hand Montessori Roseville MN"                                  
[1153] "Frederick High School Frederick MD"                                    
[1154] "Tenaya Middle School Merced CA"                                        
[1155] "Lawson Elementary School Little Rock AR"                               
[1156] "Pershing Elementary School University City MO"                         
[1157] "Seguin High School Seguin TX"                                          
[1158] "Ruth Deskin Elementary School Las Vegas NV"                            
[1159] "North Thurston High School Lacey WA"                                   
[1160] "Dr. Gustavus Brown Elementary School Waldorf MD"                       
[1161] "Willow Elementary School Cleveland OH"                                 
[1162] "Conyers Middle School Conyers GA"                                      
[1163] "Corona del Sol High School Tempe AZ"                                   
[1164] "Unknown School (bus) Jacksonville FL"                                  
[1165] "Robinson High School Robinson TX"                                      
[1166] "Southwestern Classical Academy Flint MI"                               
[1167] "Everglades City School Everglades City FL"                             
[1168] "South Macon Elementary School Franklin NC"                             
[1169] "Fort Calhoun Elementary School Fort Calhoun NE"                        
[1170] "Sarah J. Rawson Elementary School Hartford CT"                         
[1171] "John Jay High School San Antonio TX"                                   
[1172] "Coppell Middle School East Dallas TX"                                  
[1173] "Elolf Elementary School Converse TX"                                   
[1174] "Paradise High School Paradise TX"                                      
[1175] "William Velasquez Elementary School Richmond TX"                       
[1176] "W.S. Hornsby Elementary School Augusta GA"                             
[1177] "Newberg High School Newberg OR"                                        
[1178] "Northside High School Lafayette LA"                                    
[1179] "Central Elementary School Stateville NC"                               
[1180] "Harrisburg High School Harrisburg SD"                                  
[1181] "Karen Wagner High School San Antonio TX"                               
[1182] "Ed White Middle School San Antonio TX"                                 
[1183] "Vereen School Moultrie GA"                                             
[1184] "Sulphur Rock Magnet School Sulphur Rock AR"                            
[1185] "Nathaniel “Traz” Powell Stadium (high school game) Miami FL"           
[1186] "West High School Wichita KS"                                           
[1187] "Central Middle School Dover DE"                                        
[1188] "Harmony Grove High School Benton AR"                                   
[1189] "Northwestern Community High School Indianapolis IN"                    
[1190] "Lawrence Central High School Indianapolis IN"                          
[1191] "Benjamin Franklin High School Philadelphia PA"                         
[1192] "Muskegon Heights High School Muskegon Heights MI"                      
[1193] "Independence High School Glendale AZ"                                  
[1194] "Rock Crush Elementary School Homosassa FL"                             
[1195] "Chester High School (bus) Chester PA"                                  
[1196] "Palestine High School Palestine TX"                                    
[1197] "Madison High School Middletown OH"                                     
[1198] "Huffman High School Birmingham AL"                                     
[1199] "Antigo High School Antigo WI"                                          
[1200] "Kimball High School Dallas TX"                                         
[1201] "East High School Pueblo CO"                                            
[1202] "High Point High School Beltsville MD"                                  
[1203] "Oscar Patterson Elementary School Panama City FL"                      
[1204] "Robert Stuart Middle School Twin Falls ID"                             
[1205] "Southside High School Greenville SC"                                   
[1206] "Augusta High School Augusta KS"                                        
[1207] "Jeremiah Burke High School Dorchester MA"                              
[1208] "Mcnair Elementary School Chicago IL"                                   
[1209] "Woodrow Wilson Junior High School Hanford CA"                          
[1210] "Ava High School Ava MO"                                                
[1211] "Wedgewood Middle School Columbus OH"                                   
[1212] "Southridge High School Miami FL"                                       
[1213] "McClain High School Tulsa OK"                                          
[1214] "Detroit Collegiate Preparatory High School Detroit MI"                 
[1215] "Alpine High School Alpine TX"                                          
[1216] "Cedar Rapids Jefferson High School Cedar Rapids IA"                    
[1217] "Small Athletic Field (William Penn Senior High School game) York PA"   
[1218] "T.A Wilson Academy (bus) Jackson MS"                                   
[1219] "Elder High School Cincinnati OH"                                       
[1220] "Townville Elementary School Townville SC"                              
[1221] "Christ of King Jesuit College Prep (bus) Chicago IL"                   
[1222] "Dunbar HIgh School Fort Worth TX"                                      
[1223] "Vigor High School Mobile AL"                                           
[1224] "Linden McKinley STEM Academy Columbus OH"                              
[1225] "Benjamin E. Mays High School Atlanta GA"                               
[1226] "June Jordan High School for Equity San Francisco CA"                   
[1227] "Union Middle School Sandy UT"                                          
[1228] "Grand Junction High School Grand Junction CO"                          
[1229] "Berthoud High School Berthoud CO"                                      
[1230] "Bay City Western High School Auburn MI"                                
[1231] "Crossroads Elementary School St. Paul MN"                              
[1232] "Mueller Park Junior High School Bountiful UT"                          
[1233] "Hug High School Reno NV"                                               
[1234] "Bayless High School St. Louis MO"                                      
[1235] "Lake Forest South Elementary School Harrington DE"                     
[1236] "Alexander City Middle School Alexander City AL"                        
[1237] "Franklin County Elementary School Eastpoint FL"                        
[1238] "West Liberty-Salem High School West Liberty OH"                        
[1239] "South Aiken High School Aiken SC"                                      
[1240] "Scotlandville Magnet High School Baton Rouge LA"                       
[1241] "Maplewood Middle School Maplewood MN"                                  
[1242] "Robert E. Lee High School Montgomery AL"                               
[1243] "King City High School King City CA"                                    
[1244] "Linton Middle School Penn HIlls PA"                                    
[1245] "North Park Elementary School San Bernardino CA"                        
[1246] "Booker T. Washington High School Tulsa OK"                             
[1247] "Moss Bluff Elementary School Lake Charles LA"                          
[1248] "Kerbyville High School Kirbyville TX"                                  
[1249] "McMillan Middle School Omaha NE"                                       
[1250] "Greensboro High School Greensboro AL"                                  
[1251] "McLain High School Tulsa OK"                                           
[1252] "Warren Elementary School Chicago IL"                                   
[1253] "Wilson High School Florence SC"                                        
[1254] "Hickman Academy Preparatory School Milwaukee WI"                       
[1255] "Spanish Fork High School Spanish Fork UT"                              
[1256] "Bazemore-Hyder Stadium (Valdosta High School) Valdosta GA"             
[1257] "Lithia Spring High Lithia Springs GA"                                  
[1258] "Arroyo Valley High School San Bernardino CA"                           
[1259] "North Little Rock High School North Little Rock AR"                    
[1260] "Columbus Scioto 6-12 Columbus OH"                                      
[1261] "Freeman High School Rockford WA"                                       
[1262] "Mattoon High School Mattoon IL"                                        
[1263] "Southern Middle School Lwxington KY"                                   
[1264] "Lees Summit North High School Lees Summit MO"                          
[1265] "Sun Valley High School Los Angeles CA"                                 
[1266] "Purchase Line Elementary School Commodore PA"                          
[1267] "Charlotte School Bus Charlotte NC"                                     
[1268] "Kernersville Elementary School Kernersville NC"                        
[1269] "Start High School Toledo OH"                                           
[1270] "Proctor High School Utica NY"                                          
[1271] "Pattengill Academy Lansing MI"                                         
[1272] "Benjamin Banneker High School College Park GA"                         
[1273] "Lakeview Academy Milledgeville GA"                                     
[1274] "Rancho Tehama Elementary School Rancho Tehama Reserve CA"              
[1275] "Lake Minneola High School Minneola FL"                                 
[1276] "North Side High School Jackson TN"                                     
[1277] "Manual High School Denver CO"                                          
[1278] "Booksin Elementary School San Jose CA"                                 
[1279] "Bath High School Lima OH"                                              
[1280] "Salem High School Virginia Beach VA"                                   
[1281] "Aztec High School Aztec NM"                                            
[1282] "Champaign Central High School Champaign IL"                            
[1283] "High Point Central High School High Point NC"                          
[1284] "Sam Rayburn High School Pasadena TX"                                   
[1285] "Elisha M. Pease Elementary School Dallas TX"                           
[1286] "Beecher High School Beecher MI"                                        
[1287] "Lincoln Elementary School Lancaster CA"                                
[1288] "Edna Karr High School Algiers LA"                                      
[1289] "Pinewood Elementary School Marysville WA"                              
[1290] "New Start High School Seattle WA"                                      
[1291] "Forest City School Bus Forest City IA"                                 
[1292] "Coronado Elementary School Sierra Vista AZ"                            
[1293] "Montpelier High School Montpelier VT"                                  
[1294] "Italy High School Italy TX"                                            
[1295] "NET Charter High School New Orleans LA"                                
[1296] "Marshall County High School Benton KY"                                 
[1297] "Murphy High School Mobile AL"                                          
[1298] "Dearborn High School Dearborn MI"                                      
[1299] "Lincoln High School Philadelphia PA"                                   
[1300] "Salvador B. Castro Middle School Los Angeles CA"                       
[1301] "Harmony Learning Center Maplewood MN"                                  
[1302] "Oxon Hill High School Oxon Hill MD"                                    
[1303] "The Metropolitan High School New York NY"                              
[1304] "Peal-Cohn High School Nashville TN"                                    
[1305] "Marjory Stoneman Douglas High School Parkland FL"                      
[1306] "North Broward Preparatory School Coconut Creek FL"                     
[1307] "Jackson Memorial Middle School Massillon OH"                           
[1308] "Oakland High School Tacoma WA"                                         
[1309] "Dalton High School Dalton GA"                                          
[1310] "Kingston High School Cadet MO"                                         
[1311] "Huffman High School Birmingham AL"                                     
[1312] "Frederick Douglass High School Lexington KY"                           
[1313] "Seaside High School Seaside CA"                                        
[1314] "George Washington Middle School Alexandria VA"                         
[1315] "Big Sky High School Missoula MT"                                       
[1316] "Douglass Park Elementary School Portsmouth VA"                         
[1317] "Great Mills High School Great Mills MD"                                
[1318] "Eupora High School Eupora MS"                                          
[1319] "John Hardin High School Elizabethtown KY"                              
[1320] "Gloversville Middle School Gloversville NY"                            
[1321] "Rayton South Middle School Rayton MO"                                  
[1322] "Jackson High School Jackson MI"                                        
[1323] "Forest High School Ocala FL"                                           
[1324] "Benjamin E. Mays High School Atlanta GA"                               
[1325] "Waynesboro Elementary School Waynesboro TN"                            
[1326] "Enemy Swim Day School Waubay SD"                                       
[1327] "Fowlerville High School Fowlerville MI"                                
[1328] "Highland High School Palmdale CA"                                      
[1329] "Dixon High School Dixon IL"                                            
[1330] "Central High School Kansas City MO"                                    
[1331] "Santa Fe High School Santa Fe TX"                                      
[1332] "Mount Zion High School Atlanta GA"                                     
[1333] "Beaverbrook Elementary School Griffin GA"                              
[1334] "Noblesville West Middle School Noblesville IN"                         
[1335] "McKinney North High School McKinney TX"                                
[1336] "Valley Elementary School Beaver Creek OH"                              
[1337] "Grant High School Portland OR"                                         
[1338] "Skyline High School Dallas TX"                                         
[1339] "Sentinel High School Missoula MT"                                      
[1340] "Fulton Elementary School Springfield MO"                               
[1341] "Raineshaven Elementary School Memphis TN"                              
[1342] "Sunrise Point Elementary School Overland KS"                           
[1343] "Milkovich Middle School Maple Heights OH"                              
[1344] "Hurricane High School Hurricane WV"                                    
[1345] "West Valley Middle School Yakima WA"                                   
[1346] "Edgewood High School Edgewood MD"                                      
[1347] "Lakeside Middle School Millville NJ"                                   
[1348] "Antioch High School Nashville TN"                                      
[1349] "Palm Beach Central High School Wellington FL"                          
[1350] "Alabama State University Stadium (high school game) Montgomery AL"     
[1351] "Raines High School Jacksonville FL"                                    
[1352] "Metro East Lutheran High School Chicago IL"                            
[1353] "Cole Middle School Denver CO"                                          
[1354] "Towne Point Elementary School Dover DE"                                
[1355] "Villa Heights Elementary School Charlotte NC"                          
[1356] "\nOttawa Hills High School Grand Rapids MI"                            
[1357] "North Scott Junior High School Eldridge IA"                            
[1358] "Balboa High School San Francisco CA"                                   
[1359] "Luisa Pineiro Fuentes School of Science and Discovery New York NY"     
[1360] "Providence Career and Technical Academy Providence RI"                 
[1361] "Herbert Hoover High School Des Moines IA"                              
[1362] "Gilroy High School Gilroy CA"                                          
[1363] "Chatham Academy High School Chicago IL"                                
[1364] "Fairley High School Memphis TN"                                        
[1365] "Canyon Springs High School Las Vegas NV"                               
[1366] "Boynton Beach High School Boynton Beach FL"                            
[1367] "Mariner High School Everett WA"                                        
[1368] "Blossomwood Elementary School Huntsville AL"                           
[1369] "Pomona High School Pomona CA"                                          
[1370] "CHAMPS Charter High School Los Angeles CA"                             
[1371] "Appling County High School Baxley GA"                                  
[1372] "Lawrence Orr Elementary School Charlotte NC"                           
[1373] "Central High School Philadelphia PA"                                   
[1374] "Maree Garnett Farring Elementary/Middle School Baltimore MD"           
[1375] "Hebron High School Carrollton TX"                                      
[1376] "Chamberlain High School Chamberlain SD"                                
[1377] "Chicot Elementary School Little Rock AR"                               
[1378] "Denali Montessori Elementary School Anchorage AK"                      
[1379] "Jason Lee Elementary School Portland OR"                               
[1380] "Haywood High School Brownsville TN"                                    
[1381] "Lake Taylor High School Norfolk VA"                                    
[1382] "Varina High School Henrico VA"                                         
[1383] "Battle Creek Academy Battle Creek MI"                                  
[1384] "McGavock High School Nashville TN"                                     
[1385] "Shiloh Middle School Snellville GA"                                    
[1386] "Dunbar Elementary School Bridgeport CT"                                
[1387] "Gossler Park Elementary School Manchester NH"                          
[1388] "Cody High School Detroit MI"                                           
[1389] "Butler High School Matthews NC"                                        
[1390] "Crums Lane Elementary School Louisville KY"                            
[1391] "Academy of Hope Conway SC"                                             
[1392] "Cleveland Elementary School Santa Barbara CA"                          
[1393] "Garrett Middle School Marietta GA"                                     
[1394] "Eastern Tech High School Essex MD"                                     
[1395] "Simonsdale Elementary School Portsmouth VA"                            
[1396] "Pentwater Public School Pentwater MI"                                  
[1397] "Mount Rainier High School Des Moines WA"                               
[1398] "Skyline High School Dallas TX"                                         
[1399] "Africentric Early College High School Columbus OH"                     
[1400] "Strawberry Mansion High School Philadelphia PA"                        
[1401] "Jefferson High School Jefferson NY"                                    
[1402] "Cawood Elementary School Cawood KY"                                    
[1403] "Dennis Intermediate School Richmond IN"                                
[1404] "Winnetonka High School Kansas City MO"                                 
[1405] "A.I. du Pont High School Greenville DE"                                
[1406] "Central Elementary School Belmont CA"                                  
[1407] "Cascade Middle School Eugene OR"                                       
[1408] "Central High School Tuscaloosa AL"                                     
[1409] "Hazelwood East High School St. Louis MO"                               
[1410] "Sheppard Middle School Durham NC"                                      
[1411] "Lakewood Middle School Overland Park KS"                               
[1412] "Southern Hills Elementary School Shreveport LA"                        
[1413] "Manassas High School Memphis TN"                                       
[1414] "Davidson High School Mobile AL"                                        
[1415] "Miller Grove High School Lithonia GA"                                  
[1416] "Atascocita High School Atascocita TX"                                  
[1417] "Manassas High School Memphis TN"                                       
[1418] "Minneapolis School District Bus Minneapolis MN"                        
[1419] "Frederick Douglass High School Baltimore MD"                           
[1420] "Central Academy of Excellence Kansas City MO"                          
[1421] "V. Sue Cleveland High School Rio Rancho NM"                            
[1422] "Eaglecrest High School Aurora CO"                                      
[1423] "Robert E. Lee High School Montgomery AL"                               
[1424] "Highlands Elementary School Mission KS"                                
[1425] "Lake Mary High School Orlando FL"                                      
[1426] "Blountsville Elementary School Blountsville AL"                        
[1427] "S.V. Marshall Elementary Holmes County MS"                             
[1428] "Prescott \nHigh School Prescott AR"                                    
[1429] "Saint Clair Evans Academy Jacksonville FL"                             
[1430] "Aurora West College Preparatory Academy Aurora CO"                     
[1431] "St. Josaphat Parish School Milwaukee WI"                               
[1432] "Hood Elementary School Lynn MA"                                        
[1433] "Ross Shaw Sterling Aviation High School Houston TX"                    
[1434] "Washington Middle School Lyons IL"                                     
[1435] "Concord High School Concord AR"                                        
[1436] "Wynbrooke Elementary Theme School Stone Mountain GA"                   
[1437] "Creekside High School Fairburn GA"                                     
[1438] "C.D. Hylton High School Woodbridge VA"                                 
[1439] "Weightman Middle School Wesley Chapel FL"                              
[1440] "STEM School Highlands Ranch Highlands Ranch CO"                        
[1441] "Second Change High School Chicago IL"                                  
[1442] "Parkrose High School Portland OR"                                      
[1443] "Terry Parker High School Jacksonville FL"                              
[1444] "Hendley Elementary School Washington DC"                               
[1445] "Genevieve Melody STEM Elementary School Chicago IL"                    
[1446] "Menta Academy North Waukegan IL"                                       
[1447] "Hendley Elementary School Washington DC"                               
[1448] "Jefferson Elementary School Emmaus PA"                                 
[1449] "Tamaques Elementary School Westfield NJ"                               
[1450] "Carman-Ainsworth High School Flint Township MI"                        
[1451] "Jack Swigert Aerospace Academy Colorado Springs CO"                    
[1452] "School of Science and Applied Learning New York NY"                    
[1453] "Williwaw Elementary School Anchorage AK"                               
[1454] "Bulkeley High School Hartford CT"                                      
[1455] "Monroe Clark Middle School San Diego CA"                               
[1456] "Blount Elementary School Montgomery AL"                                
[1457] "East Magnet High School Nashville TN"                                  
[1458] "Lakewood Stadium Atlanta GA"                                           
[1459] "Saint Patrick School Carlisle PA"                                      
[1460] "Roosevelt High School St. Louis MO"                                    
[1461] "Parkway North High School St. Louis MO"                                
[1462] "Peek's Chapel Elementary School Conyers GA"                            
[1463] "William C. Longstreth Elementary School Philadelphia PA"               
[1464] "Roosevelt High School Roosevelt NY"                                    
[1465] "Hollenbeck Middle School Los Angeles CA"                               
[1466] "Ladd-Peebles Stadium Mobile AL"                                        
[1467] "Kinston High School Kingston NC"                                       
[1468] "Central Catholic High School Toledo OH"                                
[1469] "Northwood Elementary School Baltimore MD"                              
[1470] "McKee Middle School Jeannette PA"                                      
[1471] "Center Point High School Center Point AL"                              
[1472] "West Palmer High School Morrisville PA"                                
[1473] "South Aiken High School Aiken SC"                                      
[1474] "Manhattan High School Manhattan KS"                                    
[1475] "Granger High School West Valley City UT"                               
[1476] "Ethel M. Gildersleeve Middle School Newport News VA"                   
[1477] "Eastern Hills High School Fort Worth TX"                               
[1478] "Phoebus High School Hampton VA"                                        
[1479] "Illinois Central School Bus Kankakee IL"                               
[1480] "Simon Gratz High School Mastery Charter Philadelphia PA"               
[1481] "Zebulon B. Vance High School Charlotte NC"                             
[1482] "South Atlanta High School Atlanta GA"                                  
[1483] "Sheridan High School Sheridan CO"                                      
[1484] "Westbury High School Houston TX"                                       
[1485] "Greenhalge Elementary School Lowell MA"                                
[1486] "Rayne High School Rayne LA"                                            
[1487] "George Washington Carver High School New Orleans LA"                   
[1488] "Creekside High School South Fulton GA"                                 
[1489] "Woodward High School Toledo OH"                                        
[1490] "Ridgway High School Santa Rosa CA"                                     
[1491] "Laurel Woods Elementary School Laurel MD"                              
[1492] "New Dawn Charter High School New York NY"                              
[1493] "Robert L. Thornton Elementary School Dallas TX"                        
[1494] "Edison High School Stockton CA"                                        
[1495] "Achievement Academy Baltimore MD"                                      
[1496] "Esteban Torres High School Los Angeles CA"                             
[1497] "Saugus High School Santa Clarita CA"                                   
[1498] "Pleasantville High School Pleasantville NJ"                            
[1499] "Rich Central High School Olympia Fields IL"                            
[1500] "Searles Elementary School Union City CA"                               
[1501] "Catalyst Circle Rock Charter School Chicago IL"                        
[1502] "Sarah J. Anderson Elementary School Vancouver WA"                      
[1503] "Mountain Brook High School Mountain Brook AL"                          
[1504] "Waukesha South High School Waukesha WI"                                
[1505] "Oshkosh West High School Oshkosh WI"                                   
[1506] "Thomas Jefferson Middle School Madison WI"                             
[1507] "Picacho Middle School Las Cruces NM"                                   
[1508] "J.C. Harmon High School Kansas City KS"                                
[1509] "Decatur High School Decatur AL"                                        
[1510] "Sacred Heart School Jersey City NJ"                                    
[1511] "Chase Middle School Topeka KS"                                         
[1512] "Evans Elementary School Evansville IN"                                 
[1513] "Maury High School Norfolk VA"                                          
[1514] "Catholic Academy of New Haven New Haven CT"                            
[1515] "Lely High School Naples FL"                                            
[1516] "West St. John Elementary School St. John the Baptist Parish LA"        
[1517] "Mason-Clark Middle School St. Louis MO"                                
[1518] "Southridge High School Kennewick WA"                                   
[1519] "Glades Central Community High School Belle Glade FL"                   
[1520] "McWillie Elementary School Jackson MS"                                 
[1521] "Ellis Davis Field House Dallas TX"                                     
[1522] "Bellaire High School Houston TX"                                       
[1523] "Poteet High School Mesquite TX"                                        
[1524] "Cane Bay High School Summerville SC"                                   
[1525] "Three Fires Elementary School Howell MI"                               
[1526] "North Crowley Ninth Grade Campus Fort Worth TX"                        
[1527] "Park Middle School Lincoln NE"                                         
[1528] "Lindblom Math & Science Academy High School Chicago IL"                
[1529] "Oxnard's Christa McAuliffe Elementary School Oxnard CA"                
[1530] "Robertson Elementary School Yakima WA"                                 
[1531] "Martin Van Buren High School Queens NY"                                
[1532] "White Station High School Memphis TN"                                  
[1533] "Lufkin Middle School Lufkin TX"                                        
[1534] "Deer Valley High School Antioch CA"                                    
[1535] "Hicks Elementary School Houston TX"                                    
[1536] "George Washington Carver Elementary School Jacksonville FL"            
[1537] "Beau Chene High School Arnaudville LA"                                 
[1538] "Second Start Alternative High School Concord NH"                       
[1539] "Johnson-Wabash Elementary School Ferguson MO"                          
[1540] "Dunbar High School Washington DC"                                      
[1541] "Cesar Chavez Community School Albuquerque NM"                          
[1542] "North Forney High School Forney TX"                                    
[1543] "Sagemont School Weston FL"                                             
[1544] "Shenango Area Schools (bus) New Castle PA"                             
[1545] "Pine View Elementary Rockwood TN"                                      
[1546] "Atascocita High School Humble TX"                                      
[1547] "Booker T. Washington High School Shreveport LA"                        
[1548] "Roy Shelling Elementary School Monroe LA"                              
[1549] "Narvie J. Harris Elementary School Stonecrest GA"                      
[1550] "Morton Middle School Omaha NE"                                         
[1551] "Golden West High School Visalia CA"                                    
[1552] "Stuart W Cramer High School Cramerton NC"                              
[1553] "West Gate Elementary School Manassas VA"                               
[1554] "Miles Elementary School Cleveland OH"                                  
[1555] "O'Rourke Elementary School Mobile AL"                                  
[1556] "Luis Munoz Marin Middle School Cleveland OH"                           

Now we can use these addresses to find the latitude and longitude coordinates for each school where a school shooting occured. To do this we will use the geocode function of the ggmap package to look up these addresses on Google Maps to get the latitude and longitude values. In this command we need to specify that we want to use google as the source using the source argument and that we want latitude and longitude using the `output = c(“latlon”) argument.

This step requires registering with the Google Cloud Platform to get an API key, which currently requires registering your payment information and agreeing to the Google Maps API Terms of Service.

Therefore, we will simply demonstrate how this process works in general, but you are not required to do this yourself.

Click here to see how we registered with the Google Cloud Platform.

If you were to do this process yourself, you could get an API key here. Again this requires registering your payment information, but it is free to got an API key and enable the APIs, however you can be billed based on how many addresses you look up using the APIs. You need to look up thousands before getting billed.

Then you need to enable the maps and places APIs, by clicking on the boxes next to each:

Then you would register like so after copying the API key: (Note this is a fake key)


Once we have obtained an API key and registered, we can geocode our data.

Note that this step is time intensive, as there are many addresses to look up! Therefore, we will just show how this is done.

This results in tibble called coords being added to our shooting_data tibble. That’s right we can have a tibble as a column or variable within a tibble. Using the glimpse function again, and looking at the last few variables, we can see that now the last variable listed is coords of class <tibble>.

If we take a look at the first couple of values of the coords tibble, using the slice_head() function of the dplyr package, we see a tibble that looks like this:

It would be better if each of these were their own columns in the tibble, so we will create new longitude and latitude variables again using the mutate function like so:

In this case we use the pull() function to grab the lat and lon variables within the coords tibble which is a variable of the shooting_data tibble.

We can now remove the coords tibble like so, using the select() funtion of the dplyr package:

Now using glimpse() and looking at the last several variables, we can see that we no longer have a coords variable, but we do have two variables calld longitude and latitude that are of class double as indicated by the <dbl>:

Now we will save the geocoded data in the processed_data directory using the write_csv function of the readr package.

This requires listing the R object, followed by the path for where the file should be saved and what it should be called. In this case it will be called “shooting_data.csv”.

Great now we will work with this data, thus you do not need to get an API key to get to this point. We can read our processed geocoded data into R by using the read_csv() function of the readr package.

Geometry lists with the sf package

From this section on, we are now going to use a special pipe operator from the magrittr package called the compound assignment pipe-operator or sometimes the double pipe operator, that looks like this %<>%.

This allows us to use the an input and reassign it at the end after all the subsequent steps have been performed. We can therefore use data_input %<>% instead of data_input <- data_input %>%. We will deomonstrate this in the code below.

We will use the sf (which stands for simple features) package to create what is called a geometry list of our latitude and longitude information for the schools where shootings occured. This will allow us to create a map of these events.

The first thing we need to do is create an sf object (meaning an object that the sf package recognizes) using the st_as_sf() function.

However, to do this we first need to remove rows with NA values for the latitude and longitude variables. In otherwords, we need to remove rows of events that happened at schools with locations that were not identified by google. We can remove this rows using the drop_na() function of the tidyr package. We will use a . to indicate that we want to use the data that we are using as an input with our pipe, but then we will specify that we want to only drop rows were there is an NA value for either the latitude or longitude variables.

[1] 1556   52
# A tibble: 5 x 3
  longitude latitude address                                    
      <dbl>    <dbl> <chr>                                      
1        NA       NA John Marshall High School Los Angeles CA   
2        NA       NA John Marshall High School Los Angeles CA   
3        NA       NA John Marshall High School Los Angeles CA   
4        NA       NA Buell Elementary School Flint MI           
5        NA       NA Country Day High School Estate Concordia VI

Now let’s take a look at the variables in our data related to location by using the select() function of the dplyr package:

# A tibble: 1,551 x 5
   School                         City         State      latitude longitude
   <chr>                          <chr>        <chr>         <dbl>     <dbl>
 1 Hine Junior High School        Washington   <NA>           38.9     -77.0
 2 Sousa Junior High              Washington   <NA>           38.9     -77.0
 3 Unnamed High School            Washington   <NA>           38.9     -77.0
 4 John F. Kennedy High School    Cleveland    Ohio           41.4     -81.6
 5 David Starr Jordan High School Long Beach   California     33.9    -118. 
 6 Pine Bluff Coleman High School Pine Bluff   Arkansas       34.2     -92.1
 7 Pierre S. Dupont High School   Wilmington   Delaware       39.8     -75.5
 8 Carver High School             Delray Beach Florida        26.5     -80.1
 9 Ben Lomond High School         Ogden        Utah           41.3    -112. 
10 Riverside High School          El Paso      Texas          31.7    -106. 
# … with 1,541 more rows

We can see (using the base dim() function) that the dimensions were 1156 rows of 51 variables, but they are now 1551 rows of 50 variables. This is becuase 5 events occured at schools with unidentified complete locations (missing either latitude, longitude, or both).

Now, we are ready to convert our coordinates variables (latitude and longitude) into a coordiante simple feature using the st_as_sf() function. We need to specify what our coordinate variables are and we will also specify what coordinate reference system,(crs) we would like to use. In our case we will use the ESPG reference number 4326, known as ESPG:4326 or the World Geodetic System (WGS) version 84 which is one of the most commonly used CPS and used by by most global positioning systems, known as GPS. This tells R to use the values for the variables called latitude and longitude as latitude and longitude coordinates.

[1] 1551   51

We can see that our latitude and longitude variables were used to create a single new variable called geometry of class <POINT [\(^{\circ}\)]>, thus we have one less column.

In this case, we can take a look at just the first 4 variables and we will also see our last sf variable as well appeneded at the end. So now we can see the variables related to location by simply typing [1:4] next to the name of our tibble shooting_data_geocoded.

Simple feature collection with 1551 features and 4 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: -161.7705 ymin: 21.31061 xmax: -68.85822 ymax: 61.23202
CRS:            EPSG:4326
# A tibble: 1,551 x 5
   Date       School                  City       State_abb              geometry
   <date>     <chr>                   <chr>      <chr>               <POINT [°]>
 1 1970-01-05 Hine Junior High School Washington DC         (-76.97829 38.89261)
 2 1970-01-05 Sousa Junior High       Washington DC         (-76.95315 38.88397)
 3 1970-01-05 Unnamed High School     Washington DC         (-76.98263 38.86993)
 4 1970-02-06 John F. Kennedy High S… Cleveland  OH          (-81.57341 41.4425)
 5 1970-03-23 David Starr Jordan Hig… Long Beach CA         (-118.1842 33.87129)
 6 1970-04-15 Pine Bluff Coleman Hig… Pine Bluff AR         (-92.05407 34.21608)
 7 1970-04-22 Pierre S. Dupont High … Wilmington DE         (-75.53298 39.76428)
 8 1970-05-08 Carver High School      Delray Be… FL         (-80.11266 26.45975)
 9 1970-05-15 Ben Lomond High School  Ogden      UT          (-111.951 41.25111)
10 1970-08-28 Riverside High School   El Paso    TX         (-106.3723 31.73379)
# … with 1,541 more rows

Now to allow our points to not overlap for events that took place in the same location, we will add a bit more range so that they don’t overlap one another on our map, we will transform the coordinates using the st_transform() function of the sf package into a two dimensional projection (called the Albers equal-area conic projection) with units in meters using the crs 102008 and then use the st_jitter() of the sf package function to allow a specified amount of range near the actual original GPS coordinates. In this case we will allow for 50 meters of range.

To learn more about geospatial coordinate systems see here and here.

So here we can see the output after transforming our data:

Simple feature collection with 1551 features and 4 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: -5937645 ymin: -1635633 xmax: 2001910 ymax: 3621404
CRS:            EPSG:102008
# A tibble: 1,551 x 5
   Date       School                 City       State_abb               geometry
   <date>     <chr>                  <chr>      <chr>                <POINT [m]>
 1 1970-01-05 Hine Junior High Scho… Washington DC            (1544734 24955.29)
 2 1970-01-05 Sousa Junior High      Washington DC            (1546951 24368.15)
 3 1970-01-05 Unnamed High School    Washington DC            (1544919 22266.26)
 4 1970-02-06 John F. Kennedy High … Cleveland  OH              (1129318 256372)
 5 1970-03-23 David Starr Jordan Hi… Long Beach CA          (-1933762 -492186.2)
 6 1970-04-15 Pine Bluff Coleman Hi… Pine Bluff AR          (345345.1 -672058.2)
 7 1970-04-22 Pierre S. Dupont High… Wilmington DE            (1638333 149745.7)
 8 1970-05-08 Carver High School     Delray Be… FL            (1533712 -1445851)
 9 1970-05-15 Ben Lomond High School Ogden      UT           (-1251363 253198.6)
10 1970-08-28 Riverside High School  El Paso    TX         (-937777.2 -916799.7)
# … with 1,541 more rows

And here we can see the output after adding the jitter:

Simple feature collection with 1551 features and 4 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: -5937644 ymin: -1635583 xmax: 2001920 ymax: 3621431
CRS:            EPSG:102008
# A tibble: 1,551 x 5
   Date       School                 City       State_abb               geometry
   <date>     <chr>                  <chr>      <chr>                <POINT [m]>
 1 1970-01-05 Hine Junior High Scho… Washington DC            (1544686 24933.88)
 2 1970-01-05 Sousa Junior High      Washington DC            (1546921 24347.86)
 3 1970-01-05 Unnamed High School    Washington DC            (1544888 22258.41)
 4 1970-02-06 John F. Kennedy High … Cleveland  OH            (1129337 256371.4)
 5 1970-03-23 David Starr Jordan Hi… Long Beach CA          (-1933738 -492138.5)
 6 1970-04-15 Pine Bluff Coleman Hi… Pine Bluff AR            (345306 -672037.2)
 7 1970-04-22 Pierre S. Dupont High… Wilmington DE              (1638365 149766)
 8 1970-05-08 Carver High School     Delray Be… FL            (1533677 -1445810)
 9 1970-05-15 Ben Lomond High School Ogden      UT           (-1251341 253240.2)
10 1970-08-28 Riverside High School  El Paso    TX         (-937779.3 -916835.3)
# … with 1,541 more rows

Notice how the geometry values have changed.

Now we will transform our coordinates back into the 3D latitude and longitude degree system again using the st_transform() function and the ESPG:4326, corrdinate system.

Simple feature collection with 1551 features and 4 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: -161.771 ymin: 21.31023 xmax: -68.85824 ymax: 61.23191
CRS:            EPSG:4326
# A tibble: 1,551 x 5
   Date       School                  City       State_abb              geometry
   <date>     <chr>                   <chr>      <chr>               <POINT [°]>
 1 1970-01-05 Hine Junior High School Washington DC         (-76.97892 38.89252)
 2 1970-01-05 Sousa Junior High       Washington DC         (-76.95356 38.88386)
 3 1970-01-05 Unnamed High School     Washington DC         (-76.98301 38.86992)
 4 1970-02-06 John F. Kennedy High S… Cleveland  OH         (-81.57317 41.44248)
 5 1970-03-23 David Starr Jordan Hig… Long Beach CA         (-118.1841 33.87174)
 6 1970-04-15 Pine Bluff Coleman Hig… Pine Bluff AR         (-92.05451 34.21627)
 7 1970-04-22 Pierre S. Dupont High … Wilmington DE         (-75.53254 39.76439)
 8 1970-05-08 Carver High School      Delray Be… FL         (-80.11294 26.46015)
 9 1970-05-15 Ben Lomond High School  Ogden      UT         (-111.9508 41.25149)
10 1970-08-28 Riverside High School   El Paso    TX         (-106.3723 31.73349)
# … with 1,541 more rows

Notice how the geometry variables are different from what they were orginally with this coordinate system:

Now we will separate the geometry variable into longitude and latitude variables again. We can use the st_coordinates() function of the sf package to extract the coordinates from our tibble as a matrix.

# A tibble: 4 x 2
      X     Y
  <dbl> <dbl>
1 -77.0  38.9
2 -77.0  38.9
3 -77.0  38.9
4 -81.6  41.4

Now, just as we did previously we will create new variables called latitude and longitude from the X and Y variables within the coordinates tibble that is part of our shooting_data_geocoded using the pull() function.

We will also convert our shooting_data_geocoded object which is currently a sf into a tibble using the as_tibble() function of the tibble package and then we will remove the geometry and coordinates variables using the select() function of the dplyr package with a negative sign infront of the names of the variables to remove.

And now we can take a look at our last 3 variables using the last_col() function, which is a select helper function tidyr package. See here for other select helper functions. This allows us to select either the last column, or with a specified offset we can select a number of columns before the last column. Thus 2 columns before the last column would be last_col(offset = 2) and then the : symbol is interpreted as through, thus we are selecting for the third to last column through the last column with last_col(offset = 2): last_col().

# A tibble: 4 x 3
  address                                  longitude latitude
  <chr>                                        <dbl>    <dbl>
1 Hine Junior High School Washington DC        -77.0     38.9
2 Sousa Junior High Washington DC              -77.0     38.9
3 Unnamed High School Washington DC            -77.0     38.9
4 John F. Kennedy High School Cleveland OH     -81.6     41.4

Great! That looks like we expected. We can see that the coordinate values are slightly different now.

# A tibble: 4 x 2
  longitude latitude
      <dbl>    <dbl>
1     -77.0     38.9
2     -77.0     38.9
3     -77.0     38.9
4     -81.6     41.4

tibble [1,551 × 52] (S3: tbl_df/tbl/data.frame)
 $ Date                                                                                                                                              : Date[1:1551], format: "1970-01-05" "1970-01-05" ...
 $ School                                                                                                                                            : chr [1:1551] "Hine Junior High School" "Sousa Junior High" "Unnamed High School" "John F. Kennedy High School" ...
 $ City                                                                                                                                              : chr [1:1551] "Washington" "Washington" "Washington" "Cleveland" ...
 $ State_abb                                                                                                                                         : chr [1:1551] "DC" "DC" "DC" "OH" ...
 $ Reliability Score (1-5)                                                                                                                           : num [1:1551] 3 3 2 2 2 3 3 2 2 2 ...
 $ Killed (includes shooter)                                                                                                                         : num [1:1551] 1 0 0 0 0 1 1 0 0 0 ...
 $ Wounded                                                                                                                                           : num [1:1551] 0 1 0 1 2 5 0 1 2 1 ...
 $ Total Injured/Killed Victims                                                                                                                      : num [1:1551] 1 1 0 1 2 6 1 1 2 1 ...
 $ Gender of Victims (M/F/Both)                                                                                                                      : chr [1:1551] "Male" "Male" "No Victims" "Male" ...
 $ Victim's Affiliation w/ School                                                                                                                    : chr [1:1551] "Student" "Student" "No Victims" "Student" ...
 $ Victim's age(s)                                                                                                                                   : num [1:1551] 15 NA NA 18 NA NA 18 19 NA 15 ...
 $ Victims Race                                                                                                                                      : chr [1:1551] NA NA "No Victims" NA ...
 $ Victim Ethnicity                                                                                                                                  : chr [1:1551] NA NA "No Victims" NA ...
 $ Targeted Specific Victim(s)                                                                                                                       : logi [1:1551] FALSE FALSE TRUE TRUE FALSE TRUE ...
 $ Random Victims                                                                                                                                    : logi [1:1551] TRUE TRUE FALSE FALSE FALSE TRUE ...
 $ Bullied (Y/N/ N/A)                                                                                                                                : logi [1:1551] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Domestic Violence (Y/N)                                                                                                                           : logi [1:1551] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Suicide (Shooter was only victim) Y/N/ N/A                                                                                                        : logi [1:1551] NA NA NA NA NA NA ...
 $ Suicide (shot self immediately following initial shootings) Y/N/ N/A                                                                              : logi [1:1551] NA NA NA NA NA NA ...
 $ Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A: logi [1:1551] NA NA NA NA NA NA ...
 $ Suicide (or attempted suicide) by Shooter (Y/N)                                                                                                   : logi [1:1551] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Shooter's actions immediately after shots fired                                                                                                   : chr [1:1551] "Unknown if Subdued Surrendered or Fled" "Immediately Surrendered" "Fled" "Unknown if Subdued Surrendered or Fled" ...
 $ Pre-planned school attack                                                                                                                         : logi [1:1551] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Summary                                                                                                                                           : chr [1:1551] "Didn't know how to operate pistol, cocked hammer and couldn't get it to safely release causing accidental discharge" "Occurred during horseplay in the school" "Student shot at twice during attempted robbery on playground" "Argument in school hallway escalated into shooting" ...
 $ Category                                                                                                                                          : chr [1:1551] "Accidental" "Accidental" "Robbery" "Escalation of Dispute" ...
 $ School Type                                                                                                                                       : chr [1:1551] "High" "Junior High" "High" "High" ...
 $ Narrative (Detailed Summary/ Background)                                                                                                          : chr [1:1551] "Student showing off gun cocked hammer and could not get it to release causing accidental discharge and killing "| __truncated__ "14YOM student shot during \"horseplay\" in the school hallway. Friend of the victim surrendered to police." "Group of 10 teens attempted to rob 16YOM (James Owens) on school playground. When victim ran, unknown teen susp"| __truncated__ "Argument between shooter and victim escalated into shooting in school hallway." ...
 $ Sources                                                                                                                                           : chr [1:1551] "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998" "https://news.google.com/newspapers?id=AfRYAAAAIBAJ&pg=3025,1894998 https://www.newspapers.com/image/156467116/?"| __truncated__ "https://www.newspapers.com/image/156467116/?terms=school%2Bshooting" "https://www.newspapers.com/image/18059538/?terms=school%2Bshooting" ...
 $ Time of Occurrence (12 hour AM/PM)                                                                                                                : 'hms' num [1:1551] NA NA NA NA ...
  ..- attr(*, "units")= chr "secs"
 $ Duration (minutes)                                                                                                                                : num [1:1551] 1 1 1 1 NA 8 1 1 NA 1 ...
 $ Day of week (formula)                                                                                                                             : chr [1:1551] "Mon" "Mon" "Mon" "Fri" ...
 $ During School Day (Y/N)                                                                                                                           : logi [1:1551] TRUE TRUE TRUE TRUE FALSE TRUE ...
 $ Time Period                                                                                                                                       : chr [1:1551] NA NA NA NA ...
 $ During a Sporting Event (Y/N)                                                                                                                     : logi [1:1551] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ During a school sponsored event (school dance, concert, play, activity)                                                                           : chr [1:1551] "No" "No" "No" "No" ...
 $ Location                                                                                                                                          : chr [1:1551] "Inside School Building" "Inside School Building" "Outside on School Property" "Inside School Building" ...
 $ Number of Shots Fired                                                                                                                             : num [1:1551] 1 1 2 4 NA NA 1 1 2 NA ...
 $ Firearm Type                                                                                                                                      : chr [1:1551] "Handgun" "Handgun" "Handgun" "Handgun" ...
 $ Number of Shooters                                                                                                                                : num [1:1551] 1 1 1 1 2 8 1 1 1 2 ...
 $ Shooter Name                                                                                                                                      : chr [1:1551] "Minor" "Minor" "Unknown" "Gertis J. Perry" ...
 $ Shooter Age                                                                                                                                       : num [1:1551] 15 NA NA 18 NA NA 16 18 15 NA ...
 $ Shooter Gender                                                                                                                                    : chr [1:1551] "Male" "Male" "Male" "Male" ...
 $ Race                                                                                                                                              : chr [1:1551] NA NA NA NA ...
 $ Shooter Ethnicity                                                                                                                                 : chr [1:1551] NA NA NA "Not Hispanic or Latino" ...
 $ Shooter's Affiliation with School                                                                                                                 : chr [1:1551] "Student" "Student" "Student" "Student" ...
 $ Shooter had an accomplice who did not fire gun (Y/N)                                                                                              : logi [1:1551] TRUE FALSE TRUE FALSE TRUE TRUE ...
 $ Hostages Taken (Y/N)                                                                                                                              : logi [1:1551] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ State                                                                                                                                             : chr [1:1551] NA NA NA "Ohio" ...
 $ Date_year                                                                                                                                         : num [1:1551] 1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
 $ address                                                                                                                                           : chr [1:1551] "Hine Junior High School Washington DC" "Sousa Junior High Washington DC" "Unnamed High School Washington DC" "John F. Kennedy High School Cleveland OH" ...
 $ longitude                                                                                                                                         : num [1:1551] -77 -77 -77 -81.6 -118.2 ...
 $ latitude                                                                                                                                          : num [1:1551] 38.9 38.9 38.9 41.4 33.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   Date = col_date(format = ""),
  ..   School = col_character(),
  ..   City = col_character(),
  ..   State_abb = col_character(),
  ..   `Reliability Score (1-5)` = col_double(),
  ..   `Killed (includes shooter)` = col_double(),
  ..   Wounded = col_double(),
  ..   `Total Injured/Killed Victims` = col_double(),
  ..   `Gender of Victims (M/F/Both)` = col_character(),
  ..   `Victim's Affiliation w/ School` = col_character(),
  ..   `Victim's age(s)` = col_double(),
  ..   `Victims Race` = col_character(),
  ..   `Victim Ethnicity` = col_character(),
  ..   `Targeted Specific Victim(s)` = col_logical(),
  ..   `Random Victims` = col_logical(),
  ..   `Bullied (Y/N/ N/A)` = col_logical(),
  ..   `Domestic Violence (Y/N)` = col_logical(),
  ..   `Suicide (Shooter was only victim) Y/N/ N/A` = col_logical(),
  ..   `Suicide (shot self immediately following initial shootings) Y/N/ N/A` = col_logical(),
  ..   `Suicide (e.g., shot self at end of incident - time period between first shots and suicide, different location, when confronted by police) Y/N/ N/A` = col_logical(),
  ..   `Suicide (or attempted suicide) by Shooter (Y/N)` = col_logical(),
  ..   `Shooter's actions immediately after shots fired` = col_character(),
  ..   `Pre-planned school attack` = col_logical(),
  ..   Summary = col_character(),
  ..   Category = col_character(),
  ..   `School Type` = col_character(),
  ..   `Narrative (Detailed Summary/ Background)` = col_character(),
  ..   Sources = col_character(),
  ..   `Time of Occurrence (12 hour AM/PM)` = col_time(format = ""),
  ..   `Duration (minutes)` = col_double(),
  ..   `Day of week (formula)` = col_character(),
  ..   `During School Day (Y/N)` = col_logical(),
  ..   `Time Period` = col_character(),
  ..   `During a Sporting Event (Y/N)` = col_logical(),
  ..   `During a school sponsored event (school dance, concert, play, activity)` = col_character(),
  ..   Location = col_character(),
  ..   `Number of Shots Fired` = col_double(),
  ..   `Firearm Type` = col_character(),
  ..   `Number of Shooters` = col_double(),
  ..   `Shooter Name` = col_character(),
  ..   `Shooter Age` = col_double(),
  ..   `Shooter Gender` = col_character(),
  ..   Race = col_character(),
  ..   `Shooter Ethnicity` = col_character(),
  ..   `Shooter's Affiliation with School` = col_character(),
  ..   `Shooter had an accomplice who did not fire gun (Y/N)` = col_logical(),
  ..   `Hostages Taken (Y/N)` = col_logical(),
  ..   State = col_character(),
  ..   Date_year = col_double(),
  ..   address = col_character(),
  ..   longitude = col_double(),
  ..   latitude = col_double()
  .. )
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "names")= chr [1:53] "Date" "School" "City" "State_abb" ...

Looks good!

Now we will save our wrangled data, again using write_csv().

from Michael:

INTRODUCE THE CONCEPT OF DASHBOARDS

INTRODUCE flexdashboard

Data Analysis and Visualization


First let’s load the data by reading in our wrangled version of the data.

There are several elements we would like to include in our dashboard.

One thing we would like is an interactive table.

We can done so using the datatable() function of the DT package.

This creates a searchable table and the order in which the data is displayed can be toggled to change for each variable.

However, we have many varaibles, so this get’s to be overwhelming. Since there are so many this even modifies the way the rmarkdown for this case study is rendered, thus instead of displaying all of the variables, let’s choose only some of the most interesting to display on our dashboard.

Now we would also like to make some visualizations of our data.

Yearly Shootings

First, we would like to create a plot of the number of shootings per year.

To do this we will first count the number of shootings per year by using the group_by() function and the count() function of the dplyr package. The group_by() functions allows us to summarize the data across specific groups specified by a variable or multiple variables. By grouping by Date_year we can then use the count() function to count the number of rows with shooting event information for each unique value of the Date_year variable.

We then want to use the ungroup() function to get the data out of this grouping based on the Data_year varaible.

# A tibble: 51 x 2
   Date_year Shootings
       <dbl>     <int>
 1      1970        20
 2      1971        21
 3      1972        18
 4      1973        18
 5      1974        16
 6      1975        14
 7      1976        11
 8      1977        16
 9      1978        16
10      1979        14
# … with 41 more rows

Nice looks good!

Now to make a plot of this data we will use the ggplot2 package.

Click here for an introduction about this package if you are new to using ggplot2

The ggplot2 package is generally intuitive for beginners because it is based on a grammar of graphics or the gg in ggplot2. The idea is that you can construct many sentences by learning just a few nouns, adjectives, and verbs. There are specific “words” that we will need to learn and once we do, you will be able to create (or “write”) hundreds of different plots.

The critical part to making graphics using ggplot2 is the data needs to be in a tidy format. Given that we have just spent time putting our data in tidy format, we are primed to take advantage of all that ggplot2 has to offer!

We will show how it is easy to pipe tidy data (output) as input to other functions that create plots. This all works because we are working within the tidyverse.

What is the ggplot() function? As explained by Hadley Wickham:

The grammar tells us that a statistical graphic is a mapping from data to aesthetic attributes (colour, shape, size) of geometric objects (points, lines, bars). The plot may also contain statistical transformations of the data and is drawn on a specific coordinates system.

ggplot2 Terminology:

  • ggplot - the main function where you specify the dataset and variables to plot (this is where we define the x and y variable names)
  • geoms - geometric objects
    • e.g. geom_point(), geom_bar(), geom_line(), geom_histogram()
  • aes - aesthetics
    • shape, transparency, color, fill, line types
  • scales - define how your data will be plotted
    • continuous, discrete, log, etc

The function aes() is an aesthetic mapping function inside the ggplot() object. We use this function to specify plot attributes (e.g. x and y variable names) that will not change as we add more layers.

Anything that goes in the ggplot() object becomes a global setting. From there, we use the geom objects to add more layers to the base ggplot() object. These will define what we are interested in illustrating using the data.


For more of an introduction on creating plots with ggplot2 , see this case study

First, we start with the ggplot() function of the ggplot2 package.

This function requires that the aesthetics aes() be specified. This involves choosing what variable will be plotted on the x-axis and the y axis.

This will create an empty plot area, next we need to use one of the geom* functions of the ggplot2 package to specify what type of plot we want to create.

Type geom into the RStudio console and you will see many options to scroll through.

We will be creating a geom_col() plot, which is a particular type of bar plot that uses the acutal values to plot, rather than counts, which is the default of geom_bar() We will specify with the fill argument, that we want our bars to be filled with the color black.

We will also modify the x-axis using the scale_x_continuous() function. This function allows for specification of the range or limits of the axis using the limits argument. We can use the base seq() function to create a sequence of numbers for each tick mark.

We can add labels to our plot using the labs() function of ggplot2. This has arguments such as x and y for the axes and title and subtitle for titles.

We will also modify the overall aesthetics of the plot using a theme_* function. See here for a list of options.

Yearly Cumulative Shootings

Now let’s make another plot of the cumulative deaths each year including those of the previous years. In this case we can use the shooting_per_year object that we previously made. We want to add a new variable using the mutate function called n_cum_sum by using the cumsum() function to calculate a cumulative sum based on the yearly count.

avocado explain pivot longer

# A tibble: 51 x 2
   Date_year Shootings
       <dbl>     <int>
 1      1970        20
 2      1971        21
 3      1972        18
 4      1973        18
 5      1974        16
 6      1975        14
 7      1976        11
 8      1977        16
 9      1978        16
10      1979        14
# … with 41 more rows
# A tibble: 51 x 2
   Date_year Shootings
       <dbl>     <int>
 1      1970        20
 2      1971        41
 3      1972        59
 4      1973        77
 5      1974        93
 6      1975       107
 7      1976       118
 8      1977       134
 9      1978       150
10      1979       164
# … with 41 more rows
# A tibble: 51 x 2
   Date_year Shootings
       <dbl>     <int>
 1      1970        20
 2      1971        41
 3      1972        59
 4      1973        77
 5      1974        93
 6      1975       107
 7      1976       118
 8      1977       134
 9      1978       150
10      1979       164
# … with 41 more rows
# A tibble: 102 x 3
   Date_year id        events
       <dbl> <chr>      <dbl>
 1      1970 Shootings     20
 2      1970 Deaths         8
 3      1971 Shootings     41
 4      1971 Deaths        17
 5      1972 Shootings     59
 6      1972 Deaths        23
 7      1973 Shootings     77
 8      1973 Deaths        29
 9      1974 Shootings     93
10      1974 Deaths        41
# … with 92 more rows

Good, this looks like we would expect.

Now let’s make a plot like we did before:

Deaths per Shooting

Now, lets make a plot of the number of deaths per shooting based on the Killed (includes shooter) varaible. Our first plot could also have been made using geom_bar() instead of geom_col() this makes a similar plot but automatically uses the count for one of the axes.

It is a bit difficult to see the shootings that had more numerious deaths, so we will add a facet that zooms in on this portion of the plot. We can do so, using the facet_zoom() function of the ggforce package.

This is still a bit difficult to interpret. Let’s try some other options.

The geom_freqpoly() function creates a graph that makes it very easy to see that most shootings result in zero or one death and that the maximum number of deaths in this data for a single event is in the upper twenties.

This really shows that most shooting events luckily result in no deaths, but what are the actual proportions. One way to look at this is to calucate the percentage of events that resulted in each number of deaths.

# A tibble: 11 x 3
   `Killed (includes shooter)` num_events percent
                         <dbl>      <int>   <dbl>
 1                           0        969 62.3   
 2                           1        505 32.5   
 3                           2         58  3.73  
 4                           3         12  0.771 
 5                           4          1  0.0643
 6                           5          3  0.193 
 7                           6          3  0.193 
 8                          10          2  0.129 
 9                          15          1  0.0643
10                          17          1  0.0643
11                          28          1  0.0643

Ok, this is easier to interpret than the raw count values. We can see that greater than 60% of the events had no deaths. It is however, still a bit difficult to interpret.

So now, we will also collapse the events that resulted in 4 or more deaths together and we will create a pie chart which you are likely familiar with as well as alternative plot called a waffle plot.

First to collapse the percentage for the events that had 4 or more deaths, we need to do a bit of wrangling.

We will start with filtering the data to only these events and then we will sum each of the columns using the base colSums() function with the goal of creating a new row in the deaths_perc_event object that will contain information about all events with 4 or more deaths.

Killed (includes shooter)                num_events                   percent 
               85.0000000                12.0000000                 0.7712082 

Good, now we know the overall percentage for the events that unforuntately resulted in a larger number of deaths.

Now we can combine this with the rest of our data using the bind_rows() function of the dplyr package.

# A tibble: 12 x 3
   `Killed (includes shooter)` num_events percent
                         <dbl>      <dbl>   <dbl>
 1                           0        969 62.3   
 2                           1        505 32.5   
 3                           2         58  3.73  
 4                           3         12  0.771 
 5                           4          1  0.0643
 6                           5          3  0.193 
 7                           6          3  0.193 
 8                          10          2  0.129 
 9                          15          1  0.0643
10                          17          1  0.0643
11                          28          1  0.0643
12                          85         12  0.771 

Now we want to add a new variable so that it is easy to plot and interpet the number of deaths for each percentage. We will simply add the word “deaths” to each value in the Killed (includes shooter) variable using the base paste() function. Note that this function automatically will result in a space between pasted elements. If you didnt want a space you could specify for example an underscore using the sep argument.

# A tibble: 12 x 4
   `Killed (includes shooter)` num_events percent category 
                         <dbl>      <dbl>   <dbl> <chr>    
 1                           0        969 62.3    0 deaths 
 2                           1        505 32.5    1 deaths 
 3                           2         58  3.73   2 deaths 
 4                           3         12  0.771  3 deaths 
 5                           4          1  0.0643 4 deaths 
 6                           5          3  0.193  5 deaths 
 7                           6          3  0.193  6 deaths 
 8                          10          2  0.129  10 deaths
 9                          15          1  0.0643 15 deaths
10                          17          1  0.0643 17 deaths
11                          28          1  0.0643 28 deaths
12                          85         12  0.771  85 deaths

We would like to change the value for the last row about the events that resulted in 4+ deaths.

We can use the last() function of the dplyr package combined with the pull() function to specifically grab this value.

[1] "85 deaths"

Now we can use the case_when() function yet again to change this value. Note that we could have used a stringr function to replace the specific value of “85 deaths”, but this would not be reproducible. Say we used this code again after the data got updated. Then there may be more deaths in this category and therefore this value would no longer be “85 deaths”. Instead, by using case_when(), we can use an expression for the last value of the deaths_perc_event tibble and replace that, regardless of what the value is, with “4+deaths”. Recall that case_when() replaces all other values that are not specified with NA. We do not want to lose the other values for the category variable. So to avoid this, we assign each of the values that are not the last value to what they currently are for the category variable, using TRUE ~ category.

# A tibble: 12 x 4
   `Killed (includes shooter)` num_events percent category 
                         <dbl>      <dbl>   <dbl> <chr>    
 1                           0        969 62.3    0 deaths 
 2                           1        505 32.5    1 death  
 3                           2         58  3.73   2 deaths 
 4                           3         12  0.771  3 deaths 
 5                           4          1  0.0643 4 deaths 
 6                           5          3  0.193  5 deaths 
 7                           6          3  0.193  6 deaths 
 8                          10          2  0.129  10 deaths
 9                          15          1  0.0643 15 deaths
10                          17          1  0.0643 17 deaths
11                          28          1  0.0643 28 deaths
12                          85         12  0.771  4+ deaths

Looks as we hoped. Ok, now we are ready to make more plots.

First we will start with the pie chart. This is a bit of a controversial type of plot. However, it can be very useful when you are actually looking at percentages and the goal is to see major trends in the data, such as all the groups are roughly equal or one group is particularly larger than the rest. When this is the case and you are presenting the data to an audiance that is less familiar with data science, they may expect to see a pie chart. Thus it is useful to know how to make one. However, in most other cases pie charts do a poor job at allowing us to see more subtle differences, and they are particularly confusing when we are not looking at proportions but raw counts. In those cases it is better to use a bar chart as we have already done.

There is no geom_* function that allows you to create a pie chart directly. Instead we will create our bar plot as we have and then use the coord_polar() function to wrap our y axis into a circular shape.

This is actually a fairly easy plot to interpret. We can see that most events resulted in zero deaths and that the next largest proportion resulted in one death, while a sizable but small proportion resulted in two deaths. A very small proportion resulted in three or four or more deaths.

Now we will also create a waffle plot. This plot offers one advantage over the pie chart, in that it also allows for easier interpretation of more subtle proportion differences while also showing big picture differences in efficent manner.

This requires that the data be in wide format. Thus we need to use pivot_wider() of the tidyr package to do so.

Dashboard Basics


OK, now we have our data and our plots for our dashboard!

Now we will introduce some basics about creating dashboards in R with the flexdashboard package.

Dashboard packages

To make our dashboard we will use three very useful packages:

  1. flexdashboard

Flexdashboard is a package that was created by RStudio and released in May of 2016. This package allows for users to more easily create dashboards using R markdown.

See here for a video about flexdashboard and here for a more information on how to use this package.

  1. leaflet

Leaflet is the leading open-source JavaScript library for interactive maps and is used by many websites. The leaflet R package allows for users to more easily integrate leaflet maps in R, to create maps like the one below. We will use this package to create a map of where school shootings have occured in the US.

  1. shiny

Shiny is an R package that makes it easier to create interactive web applications in R. See here for a gallery of examples. People have created a variety of diverse applications using this package- from interactive websites to games.

[source]

See here for a list of other packages that are useful for adding elements to dashboards created with the flexdashboard package.


R Markdown

The case study that you are reading right now was created using an R Markdown document. This means that it is a document that uses the Markdown language syntax.

In fact if you click the button that says “code” on the upper right corner you will download the R Markdown document for this case study.

R Markdown (Rmd) is a file format that contains Markdown sytax and embedded R code (it can also incoperate code from some other languages like Python and SQL).

[source]

These Rmd files are rendered into a variety of file outputs like PDF, word, HTML etc. by the knitr and rmarkdown packages.

This relies on conversion of the Rmd file into the Markdown language by software called Pandoc.

Markdown (which has been implemented by many languages, such as Perl, Java, Python, C#, Ruby, etc.) is a language of a particular class of programming languages called lightweight markup languages(LML).

LMLs have relatively simple and intuative syntax, and are therefore relatively easy to write and read and are converted by software into some type of less human-freindly language to create an ouput document like a PDF or an HTML file. In fact, multiple output files can be created from the same LML file!

In our case we are interested in rendering our Rmd document into a website. Thus the code in our R Markdown document will be interpreted and converted ultimately into html code.

Although LMLs tend to be quite similar, here you can see some of the differences in syntax:

[source]

See this book for more information on working with R Markdown files.

The RStudio cheatsheet for R Markdown and this tutorial are great for getting started.

avocado- how do you feel about including this tutorial - it is very good - and not code academy- but I am not familiar with the coding club but they seem like a nice group

Flexdashboard

There are several important features about the R markdown that the flexdashboard package utilizes.

These are used to specify the layout and elements of the dashboard.

Here are some major R markdown features to keep in mind for flexdashboard

  1. The beginning of an R markdown document is what is called the YAML header. This is delinated by --- three dashmarks before and after the header YAML code.

Like so:

[source]

YAML is yet another language, but unlike Markdown it is a data-oriented language and is often used for the configuration of software or to set up how a software program should work.

Thus whatever code you put in the YAML header will inclufuence the rest of the document and essentially set up how the R markdown document will render. In the example the type of output is specified.

But other more complicated features can be included. For example, we can specify that we are creating a dashboard with flexdashboard and we can specify how we want the layout of our dashboard to be displayed like so:

[source]

We will describe this in more detail soon.

  1. Components within the dashboard are delinated by using ### - if you are familiar with markdown notation, this is a level 3 markdown header.

If this includes text like so: ### text, this adds header text to the component, however this is not required.

  1. To include a plot or any output from R, use the following syntax: "```{r}" on it’s own line followed by your code, followed by "```". This creates what is called a code chunk.

[source]
  1. To add columns or rows the following syntax is used ---------. By default this notation will create new columns, however if the YAML is modifed to specify to create rows, than this same sytnax will be used to create rows. The number of dashes does not matter.

  2. To add a page to a navigation bar (also called a navbar) the following syntax is used =======. The number of dashes does not matter.

Layout

Adding Columns

To add multiple columns the following syntax is used --------- for each column and nothing additional is required in the header.

Additional features about the columns, such as the width can be specified using brackets{}like in the example below. Note that the word Column isn’t necessary. In this example two columns are created that will be oriented next to one another and elements within the columns will be placed top to bottom.

Adding Rows

To add multiple rows - the yaml needs to state that the orientation is for rows instead of for columns (see the image below), and then the same syntax is used --------- for each row instead of columns. In this example two rows are created that will be oriented on top of one another and elements within the rows will be placed next to eachother.

Again the word Row is not actually necessary.

[source]

See here for template options.

Tabs

To add tabs columns/rows we can use the following:

Column {.tabset}

Here is an example, where two columns are created and then two tabs are added to the second column.

Shiny

Interactive elements can be added to flexdashboards. In our dashboard we will use packages such as DT and Leaflet that have shiny functionality. This requires that shiny is enabled in the YAML header by including runtime:shiny in the YAML.

Here is an example of a YML that includes this:


Our Dashboard

**

OK! Now that we know a bit about the basics of creating a dashboard, let’s create our own.

We want to create a dashboard that has several tabs that will look like this:

Getting started

The first thing we need to do to create our dashboard is to create a new .Rmd document like so in R Studio:

Then we need to specify what kind of R Markdown document to create:

YAML header

Next we need to update the YAML header to look like this:

As you might expect, title: indicates the title of our dashboard.

The output: line specifies what type of output we want the .Rmd file to be rendered.

We need to include flexdashboard::flex_dashboard: as the output to create a dashboard with the flexdashboard package. This can be included on the same line as output: or on the next line with a preceding tab.

Note that YAML is sensative to spacing, thus this tab is required to get the proper output.

Then the next four lines are arguments for how the dashboard should be created.

  1. logo: allows you to include a logo on top of your dashboard. With this theme this will be in the upper left corner. The logo we chose to use came from here, but you could theoretically use any png of appropriate size.

  2. theme: allows you to specify how the dashboard will look in general. Note that this can be used to modify the genearl look of any type of R Markdown output, not just flexdashboards. See here for a list of options. In our case the theme is called readable and will create documents that look like this:

[source]
  1. orientation: the options are columns or rows and specifies if the -------- syntax creates rows or columns for the layout. This is not necessary if the option is columns.

  2. source_code: specifies if a URL will be included as a navigation bar item with access to the source code.

  3. vertical_layout: The options are fill or scroll. Fill causes the charts to resize to fill the page, while the scroll option renders plots as their natural height which may or may not require scrolling the page.

There are many other argument options for how the dashboard is displayed.

You can run the following command in the console to see more information about the arguments in the help pane of the R Studio IDE.

Also see the cran documentation for more details.

Loading the packages and data

Since we are creating our dashboard in a new Rmd file, we need to load the necessary packages and the wrangled data that we created in this Rmd file. In that Rmd file, it looks something like this. Note that all the rest of the code shown would be added to the Rmd file for the dashboard and are simply shown here for illustrative purposes.

Creating pages

Recall that === is used to designate elements that are part of the naviagation bar.

We want 7 items besides the source code (which was added automatically based on the YAML code).

So first we will create 7 divisions for these main pages. We will add icons to each from Font Awesome.

Use this link to find other icon options. If you click on the “start using this icon” botton it will take you to a page with html code like this:

[source]

Only the fa-database portion is requrired in the brackets after data-icon= to add the icon to the navigation bar.


About {data-icon="fa-question-circle"}
====================================

The Data {data-icon="fa-database"}
===================================== 

US Statistics {data-icon="fa-flag"}
=====================================

State Statistics {data-icon=fa-flag-checkered}
====================================

Map {data-icon="fa-map"}
====================================

Tutorial {.storyboard data-icon="fa-list-ol"}
====================================

Hotline {data-icon="fa-exclamation-triangle"}
====================================

The About page

OK, we will start with the About page.

On this page we will have two columns - one which will be wider than the other. Size specifications on flexdashboard are unitless; the width of any column included on a page is a function of the width set for a column against the sum of widths for all columns on that page. If we set columns sizes of 600 and 300 on a page with two columns, one column will be twice as large as the other column. We want the left column to be quite a bit larger than the right, so we will set the left as 70 and the right as 30.

Thus we will start out like so:

About {data-icon="fa-question-circle"}
===================================== 

Column {data-width = 70}
-------------------------------------

###

Column {data-width = 30}
-------------------------------------

###

Recall that ### is used to add elements to columns and rows. Note that there is no text next to the ### syntax that designates an element of our dashboard. Previously in the examples that we showed a header was used like so ### header:

We don’t actually want a header now, so we can simply use ### without any text following it. Note that you can get away with not using the ### but some elements will not render properly.

Now we will add a block of text describing the dashboard to the first column and we will add an image to the second column like the following. Notice that two astrix ** around text makes them appear as bold and one * makes it appear as italic. See this RStudio cheatsheet for some basic markdown syntax for stylizing text:

Thus this is what the code for this page looks like:

About {data-icon="fa-question-circle"}
===================================== 

Column {data-width=700}
-------------------------------------

### About

**What is the purpose of this dashboard?**

This dashboard has two purposes:

1. To Illustrate trends in school shooting events in the United States
2. To demonstrate how to create a dashboard using `R`


This dashboard uses data from the open-source [K-12 Shool Shooting Database](https://www.chds.us/ssdb/dataset/) downloaded from the [Center for Homeland Defense and Security](https://www.chds.us/c/) at the at the [Naval Postgraduate School(NPS)](https://en.wikipedia.org/wiki/Naval_Postgraduate_School). This data was downloaded in June of 2020.


Riedman, David, and Desmond O’Neill. “CHDS – K-12 School Shooting Database.” Center for Homeland Defense and Security, June 2020, [www.chds.us/ssdb](www.chds.us/ssdb).


This database includes information about school shooting events for students in grades K-12 in the United States dating back to 1970. The database has additional information not shown on our dashboard including but not limited to: 

* Location of the event at the school  
* If the event occured during a sporting event  
* Time of day of the event  
* Day of the week of the event  
* Source for the shooting information  
* If the event was pre-planned or not  
* Shooter's actions immediately following the shooting  
* Shooter characteristics (affiliation with the school, if they had accomplices, if they took hostages, and their age and race)  
* Victom characteristics (afficliation with the school, if they were targeted, their age and race)  

According to the [K-12 Shool Shooting Database](https://www.chds.us/ssdb/dataset/) website:

> The School Shooting Database Project is conducted as part of the [Advanced Thinking in Homeland Security (HSx)](https://www.chds.us/c/academic-programs/hsx/) program at the Naval Postgraduate School’s [Center for Homeland Defense and Security (CHDS)](Center for Homeland Defense and Security (CHDS).

> The database compiles information from more than 25 different sources including peer-reviewed studies, government reports, mainstream media, non-profits, private websites, blogs, and crowd-sourced lists that have been analyzed, filtered, deconflicted, and cross-referenced. All of the information is based on open-source information and 3rd party reporting.

> "This database was developed from open-source information and may include reporting errors."


**Want to learn how to create a dashboard just like this?**

Visit the *Tutorial* page of this dashboard to first learn the basics about building a dashboard with the `flexdashboard` package.

At the end of the tutorial we provide a link to this [supplementary resource by the Open Case Studies project](INCLUDE LINK HERE), which provides more detailed information about how ***this dashboard*** was created.

We have also included the source code (see upper right-hand corner) in this dashboard for more experienced `R` users looking to mimic some of what we did in this dashboard in their own.


**Disclaimer**

The purpose of the [Open Case Studies](https://opencasestudies.github.io){target="_blank"} project is **to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data**.

A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts. 

We are simply using data from the [K-12 Shool Shooting Database](https://www.chds.us/ssdb/dataset/), we did not create this database. We acknowlege (like their website) that there may be reporting errors in this database. 

**License**

This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 [(CC BY-NC 3.0)](https://creativecommons.org/licenses/by-nc/3.0/us/){target="_blank"} United States License.

Column {data-width=300}
-------------------------------------

###

'''{r, echo=FALSE, fig.cap="[Photograph by Nathan Dumlao](https://unsplash.com/photos/xPHmmVKS8lM)"}
knitr::include_graphics(here::here("img", "nathan-dumlao-xPHmmVKS8lM-unsplash.jpg"))
'''

The image used in this second column is from a website called unsplash (https://unsplash.com/) which hosts images for free use but includes information about the photographer if you chose to credit them. A short link for this image was found by clicking on it and then clicking the share button.

Notice the echo = FALSE specification for the code chunk which causes the code to be evaluated but but not shown, while fig.cap adds the figure caption.

The image is included using the include_graphics() function of the knitr package. We need to specify where this image is located for this to work. You can do this without specifying a path if the image file is in the same directory as your .Rmd file that you are using to create your dashboard. However using the here() function of the here package we can oranize our files a bit. This function will automatically start the path wherever we have included an RStudio project file, this can be done in RStudio like so:

If you are new to using RStudio projects, please see this link for more information.

Then if we create a directory or folder called img and place our image files in this directory, then we can specify the full path to this file on our computer, by just using here::here("img", "name_of_image.png"). The include_graphics() function works for a variety image file types.

The Data page

To create the structure for this page that will display the data, we will have two columns, with the first one (on the left) wider than the other. Again we will have a block of text in the column on the left like so:

The Data {data-icon="fa-database"}
===================================== 


Column {data-width=70}
-------------------------------------

###

The data is from the [Center for Homeland Defense and Security (CHDS)](Center for Homeland Defense and Security (CHDS) [K-12 Shool Shooting Database](https://www.chds.us/ssdb/dataset/). Methods are outlined [here](https://www.chds.us/ssdb/methods/) as to how incidents were identified and authenticated.

According to their website: 
> "This database was developed from open-source information and may include reporting errors."



Column {data-width=30}
-------------------------------------

###

Now we will add our DT_table to the first column. First we need to include the code that we previously used to create the DT_table in our dashboard .Rmd file:

We then include some code to render this interactive table in our dashboard. Since we have shiny enabled in our YAML header, we can use the renderDataTable() of the DT package to produce the output we desire. We also want to use the options argument to specify how the data is rendered. The scroller = TRUE argument adds a scroll bar to the table, the scrollY argument specifies that the scroll bar should be for they Y axis direction (up and down) of the table and specifies how large the scroller should be, the pageLength argument specifies how many rows should be displayed simultaneously within the table, and the autoWidth = TRUE argument specifies that the table should fit the space of the column or page it is within. We will also add a caption with a link to the original data using the tags() and withTags() functions of the htmltools package. Different options for types of tags can be selected using the $.

We will also add another image to the column on the right, overall the code looks like this:

Column {data-width=70}
-------------------------------------

###

The data used in this dashboard is from the [**Center for Homeland Defense and Security (CHDS)**](Center for Homeland Defense and Security (CHDS)) [**K-12 Shool Shooting Database**](https://www.chds.us/ssdb/dataset/). 

Their methods for identifying and authenticating incidents are outlined [here](https://www.chds.us/ssdb/methods/).

According to their website: 

>*"This database was developed from open-source information and may include reporting errors."*

***



'''{r, echo=FALSE}
# Create the DT table first
DT_table <- shooting_data %>%
  dplyr::select(Date,
                School,
                City,
                State,
                `Killed (includes shooter)`,
                `Narrative (Detailed Summary/ Background)`) %>%
  rename("Deaths" = `Killed (includes shooter)`) %>%
  rename("Narrative" = `Narrative (Detailed Summary/ Background)`)
'''



'''{r, echo=FALSE}
DT::renderDataTable({
  DT::datatable(DT_table,
                caption = htmltools::tags$caption(
                  style = 'caption-side: top; text-align: Left;',
                  htmltools::withTags(
                    div(HTML('<a href="https://www.chds.us/ssdb/dataset/)">Click here to be redirected to a page where this data can be downloaded.</a>')))),
                options = list(autoWidth = TRUE,
                               pageLength = 10,
                               scroller = TRUE,
                               scrollY = '450px'))
})
'''

Column {data-width=30}
-------------------------------------

###

'''{r, echo=FALSE, fig.cap="[Photograph by Rubén Rodriguez](https://unsplash.com/photos/IXTvnOOSTyU)"}
knitr::include_graphics(here::here("img", "ruben-rodriguez-IXTvnOOSTyU-unsplash.jpg"))
'''

Statistics page

Now Let’s create a page for US Statistics we would like to share. This time we will use the .tabset and .tabset-fade options specified for our first column.

US Statistics {data-icon="fa-flag"}
===================================== 


Column {data-width=70 .tabset .tabset-fade}
-------------------------------------

After having specified the .tabset and .tabset-fade options, we can create new tabs in the same way we would add elements to our dashboard with the ### syntax. Just like in this example:

Let’s make a tab for yearly shooting events and deaths, a tab for cumulative shooting events and deaths, and a tab about the number of deaths per shooting. In each tab we will include the code for the plots that we have previously created.

### Yearly Deaths

'''{r}
shooting_data_geocoded_us <- shooting_data_geocoded %>%
    mutate(Date = as.Date(Date, format = "%m/%d/%Y")) %>%
    mutate(Date_year = year(Date)) %>%
    group_by(Date_year) %>%
    count() %>%
    ungroup()
start <- 1970
end <- 2020
shooting_data_geocoded_us %>%
    ggplot(aes(x = Date_year, y = n)) +
    geom_bar(stat = "identity", fill = "black") +
    scale_x_continuous(breaks = seq(start, end, by = 5),
                 labels = seq(start, end, by = 5),
                 limits = c(start-1, end+1)) +
    theme_minimal() +
    labs(title = "Yearly Deaths Attributable to School Shootings",
         subtitle = "United States",
         x = "School Shootings",
         y = "")
'''

### Yearly Cumulative Deaths

'''{r}
start <- 1970
end <- 2020
shooting_data_geocoded_us2 <- shooting_data_geocoded %>%
    mutate(Date = as.Date(Date, format = "%m/%d/%Y")) %>%
    mutate(Date_year = year(Date)) %>%
    group_by(Date_year) %>%
    summarize(N = n()) %>%
    ungroup() %>%
    complete(Date_year = seq(start,end,by=1)) %>%
    mutate(n_cumsum = cumsum(N))
shooting_data_geocoded_us2 %>%
    ggplot(aes(x = Date_year, y = n_cumsum)) +
    geom_bar(stat = "identity", fill = "black") +
    scale_x_continuous(breaks = seq(start, end, by = 5),
                 labels = seq(start, end, by = 5),
                 limits = c(start-1, end+1)) +
    theme_minimal() +
    labs(title = "Yearly Cumulative Deaths Attributable to School Shootings",
         subtitle = "United States",
         x = "School Shootings",
         y = "")
'''

### Deaths per Shooting

'''{r}
shooting_data_geocoded_us3 <- shooting_data_geocoded %>%
    mutate(Date = as.Date(Date, format = "%m/%d/%Y")) %>%
    mutate(Date_year = year(Date)) %>%
    group_by(`Killed (includes shooter)`) %>%
    summarize(N = n())
shooting_data_geocoded_us3 %>%
    ggplot(aes(x = `Killed (includes shooter)`, y = N)) +
    geom_bar(stat = "identity", fill = "black") +
  scale_x_continuous(breaks = seq(0,10, by = 1),
                     labels = seq(0,10, by = 1),
                     limits = c(-1,10)) +
  scale_y_continuous() +
    theme_minimal() +
    labs(title = "Deaths per School Shooting",
         subtitle = "United States",
         x = "School Shootings",
         y = "")
'''

We include a column for value boxes.

Column {data-width=300}
------------------------------------- 

We create the first value box. We want to display some important statistics, importantly:

  • Wounded
  • Deaths
  • Shooting Completed/Attempted Suicide
  • Median Shots Fired
  • Deaths, Shooter was Only Victim
  • Use of a Single Handgun
### **Wounded**
    
'''{r}
valueBox(sum(shooting_data_geocoded$Wounded, na.rm = TRUE),
         color = "white")
'''

We create the remaining value boxes

### **Deaths**

'''{r}
valueBox(sum(shooting_data_geocoded$`Killed (includes shooter)`, na.rm = TRUE),
         color = "white")
'''

### **Shooter Completed/Attempted Suicide**

'''{r}
# this needs to be wrangled in the regular data
suicide <- shooting_data_geocoded %>%
  mutate(`Suicide (or attempted suicide) by Shooter (Y/N)` = case_when(`Suicide (or attempted suicide) by Shooter (Y/N)` == "Yes" ~ TRUE,
                                                                       TRUE ~ FALSE)) %>%
  pull(`Suicide (or attempted suicide) by Shooter (Y/N)`)

suicide <- sum(suicide,
               na.rm = TRUE) / length(suicide)

# valueBox(
#   paste(
#     round(
#       mean(suicide,
#            na.rm = TRUE) * 100,
#       2),
#     "%"),
#   color = "white")

valueBox(
  paste(
    round(suicide * 100,
          2),
  "%"),
  color = "white")
'''

### **Median Shots Fired**

'''{r}
valueBox(
  round(
  median(shooting_data_geocoded$`Number of Shots Fired`,
      na.rm = TRUE),
  2),
  color = "white")
'''

### **Deaths, Shooter was Only Victim**

'''{r}
valueBox(
  paste(
    as.character(
    round(
      100 * (sum(
    ifelse(shooting_data_geocoded$`Suicide (Shooter was only victim) Y/N/ N/A` == "Y",
                TRUE,
                FALSE), na.rm = TRUE)
    /
      sum(shooting_data_geocoded$`Killed (includes shooter)`, na.rm = TRUE)),
    2)), "%"),
  color = "white")
'''

### **Use of a Single Handgun**

'''{r}
valueBox(
  paste(
    as.character(
    round(
      100 * (sum(
    ifelse(shooting_data_geocoded$`Firearm Type` == "Rifle",
                TRUE,
                FALSE), na.rm = TRUE)
    /
      length(shooting_data_geocoded$`Firearm Type`)),
    2)), "%"),
  color = "white")
'''

Leaflet

Leaflet widgets can be included within dashboards created with flexdashboard.

Leaflet works by provided by adding base data (such as a map) and then adding markers if desired in layers. This is very similar to how ggplot functions (pun intended).

The layers displayed can be controlled using a sort of legend. Depending on the type of layers, some information may be displayed mutually exclusive of the other layers; other layers (such as circles/general markers) can be toggled on and off.

A minimap can be added.

The layers displayed when the widget is first opened can also be controlled. We did that in this case study.

groups in leaflet can be thought of as layer-specific IDs that create labels for legends and allow specific layers to be referred to in separate functions.

If we called a group “Layer 1” and then in a subsequent layer referred to “Layer 1”, Leaflet will correctly identify which layer is being referenced.

Leaflet can require a lot of computational power; this can have an impact on the types of maps produced.

Clustering options can be applied to circles/markers. Some examples of this can be found on the bottom of this page.

### Specified Title

If the title is unspecified…

###

the graphics will be recognized but no title will be shown for that particular graphic.

fig-width and fig.height operate in the code chunk options.

RA NOTES

Consult this document for a general overview:

  • case-study-structure-MO-notes

There are several datasets involved in this case study

  • Raw dataset (raw_data/K-12 SSDB (Public) - K-12 SSDB (Public) Linked.csv)
  • Geocoded dataset (processed_data/shooting_data.csv)
  • Wrangled dataset (processed_data/shooting_data_wrangled)

This document uses the geocoded dataset to produce the wrangled dataset.

The wrangled dataset is then used to produce the dashboard in the other document.

The goecoding required to produce this case study took approximately 1.5-2 hours on a Macbook Air (2015).

RA Code

We will employ the following layout for the dashboard.

RMarkdown Dashboard Structure

  • Icon (48 x 48)
  • The Data
  • Column 1: Interactive Table
  • Column 2: Photo
  • US Statistics
  • Column 1
  • Yearly Deaths
  • Yearly Cumulative Deaths
  • Deaths per Shooting
  • Column 2
  • Wounded
  • Deaths
  • Shooting Completed/Attempted Suicide
  • Median Shots Fired
  • Deaths, Shooter was Only Victim
  • Use of a Single Handgun
  • State Statistics
  • Sidebar
  • Column 1
  • Yearly Deaths
  • Yearly Cumulative Deaths
  • Deaths per Shooting
  • Map
  • Zoom (+)
  • Zoom (-)
  • Layer Controls
  • Provider Tiles
  • Circle Markers
  • Mini-map
  • About
  • Column 1
  • Disclaimer
  • How do I use this dashboard?
  • Does Open Case Studies have more resources I can access to learn about creating this dashboard?
  • Column 2: Photo
  • Tutorial
  • Step 1: Load the flexdashboard package
  • Step 2: Create and RMD document
  • Step 3: Create an appropriate YAML.
  • Step 4: Design the layout of the dashboard.
  • Step 5: Add content to the dashboard.
  • Hotline
  • Warning Signs
  • Response to Warning Signs
  • Source Code

We then create the next page, State Statistics

State Statistics {data-icon=fa-flag-checkered}
===================================== 

Column {.sidebar data-width=250}
-----------------------------------------------------------------------

'''{r}
selectInput("state_selected", label = "Select a state to explore:",
            choices = unique(map_data("state") %>%
                               filter(region!="district of columbia") %>%
                               pull(region)) %>%
              str_to_title(), selected = "Maryland")
'''

Column {data-width=750 .tabset .tabset-fade}
-----------------------------------------------------------------------

### Yearly Deaths

'''{r}
renderPlot({
  start <- 1970
  end <- 2020
  state_df <- as_tibble(cbind(state.abb, state.name))
  shooting_data_geocoded <- shooting_data_geocoded %>%
    rename("State_abb" = State) %>%
    left_join(state_df, by = c("State_abb" = "state.abb")) %>%
    rename("State" = state.name) %>%
    mutate(State = str_to_title(tolower(State))) %>%
    mutate(Date = as.Date(Date, format = "%m/%d/%Y")) # this must be applied to wrangling
  shooting_data_geocoded_f <- shooting_data_geocoded[shooting_data_geocoded$State == input$state_selected, ]
  shooting_data_geocoded_f <- shooting_data_geocoded_f %>%
    mutate(Date_year = year(Date)) %>%
    group_by(Date_year) %>%
    count() %>%
    ungroup()
  shooting_data_geocoded_f %>%
    ggplot(aes(x = Date_year, y = n)) +
    geom_bar(stat = "identity", fill = "black") +
    scale_x_continuous(breaks = seq(start, end, by = 5),
                 labels = seq(start, end, by = 5),
                 limits = c(start-1, end+1)) +
    theme_minimal() +
    labs(title = "Statewide School Shootings",
         subtitle = input$state_selected,
         x = "Yearly Deaths Attributable to School Shootings",
         y = "")
})
'''

### Yearly Cumulative Deaths

'''{r}
renderPlot({
  start <- 1970
  end <- 2020
  state_df2 <- as_tibble(cbind(state.abb, state.name))
  shooting_data_geocoded2 <- shooting_data_geocoded %>%
    rename("State_abb" = State) %>%
    left_join(state_df2, by = c("State_abb" = "state.abb")) %>%
    rename("State" = state.name) %>%
    mutate(State = str_to_title(tolower(State))) %>%
    mutate(Date = as.Date(Date, format = "%m/%d/%Y")) # this must be applied to wrangling
  shooting_data_geocoded_f2 <- shooting_data_geocoded2[shooting_data_geocoded2$State == input$state_selected, ]
  shooting_data_geocoded_f2 <- shooting_data_geocoded_f2 %>%
    mutate(Date_year = year(Date)) %>%
    group_by(Date_year) %>%
    summarize(N = n()) %>%
    ungroup() %>%
    complete(Date_year = seq(start, end, by=1),
             fill = list(N = 0)) %>%
    mutate(n_cumsum = cumsum(N))
  shooting_data_geocoded_f2 %>%
    ggplot(aes(x = Date_year, y = n_cumsum)) +
    geom_bar(stat = "identity", fill = "black") +
    scale_x_continuous(breaks = seq(start, end, by = 5),
                 labels = seq(start, end, by = 5),
                 limits = c(start-1, end+1)) +
    theme_minimal() +
    labs(title = "Yearly Cumulative Deaths Attributable to School Shootings",
         subtitle = input$state_selected,
         x = "School Shootings",
         y = "")
})
'''

### Deaths per Shooting

'''{r}
renderPlot({
  state_df3 <- as_tibble(cbind(state.abb, state.name))
  shooting_data_geocoded3 <- shooting_data_geocoded %>%
    rename("State_abb" = State) %>%
    left_join(state_df3, by = c("State_abb" = "state.abb")) %>%
    rename("State" = state.name) %>%
    mutate(State = str_to_title(tolower(State)))
  shooting_data_geocoded3 <- shooting_data_geocoded3 %>%
    mutate(Date = as.Date(Date, format = "%m/%d/%Y")) %>%
    mutate(Date_year = year(Date)) %>%
    group_by(State,`Killed (includes shooter)`) %>%
    summarize(N = n())
  shooting_data_geocoded_f3 <- shooting_data_geocoded3[shooting_data_geocoded3$State == input$state_selected, ]
  shooting_data_geocoded_f3 %>%
    ggplot(aes(x = `Killed (includes shooter)`, y = N)) +
    geom_bar(stat = "identity", fill = "black") +
  scale_x_continuous(breaks = seq(0,30, by = 1),
                     labels = seq(0,30, by = 1),
                     limits = c(-1,30)) +
  scale_y_continuous() +
    theme_minimal() +
    labs(title = "Deaths per School Shooting",
         subtitle = input$state_selected,
         x = "School Shootings",
         y = "")
})
'''

We then create the Map page.

Column {data-width=1000}
------------------------------------- 
    
### 
    
'''{r}
# would be a great idea to add a slider here if possible
# good site for icons https://iconarchive.com/

shooting_information0 <- paste('<div style="height:auto;line-height:1em;overflow:visible;padding:5px;">',
                              shooting_data_geocoded$Date,
                              "<b>",
                              shooting_data_geocoded$School,
                              "</b>",
                              shooting_data_geocoded$`Narrative (Detailed Summary/ Background)`,
                              "</div>",
                              sep = "<br/>"
)

# icon_set <- icons(
#   iconUrl = case_when(shooting_data_geocoded$`Firearm Type`=="Handgun" ~ "https://icons.iconarchive.com/icons/icons8/windows-8/48/Military-Gun-icon.png",
#                       shooting_data_geocoded$`Firearm Type`=="Rifle" ~ "https://icons.iconarchive.com/icons/icons8/windows-8/48/Military-Rifle-icon.png",
#                       TRUE ~ "https://icons.iconarchive.com/icons/dryicons/aesthetica-2/48/page-search-icon.png"),
#   iconWidth = 20,
#   iconHeight = 20
# )

leaflet(shooting_data_geocoded) %>%
  addProviderTiles(provider = providers$OpenStreetMap, group = "OpenStreetMap") %>%
  addProviderTiles(provider = providers$Esri.WorldImagery, group = "ESRI World Imagery") %>%
  addProviderTiles(provider = providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addCircleMarkers(popup = ~shooting_information0,
                   lng = ~longitude,
                   lat = ~latitude,
    radius = 5,
    color = "red",
    fillOpacity = 0.2,
    stroke = TRUE,
    clusterOptions = markerClusterOptions(),
    group = "Circles") %>%
  # addMarkers(lng = ~longitude,
  #                  lat = ~latitude,
  #            popup = ~shooting_information0,
  #                  icon = icon_set,
  #                  group = "TESTER") %>%
  addMiniMap(tiles = providers$Stamen.Toner,
             toggleDisplay = TRUE,
             minimized = FALSE) %>%
  addLayersControl(
    baseGroups = c("Toner Lite",
                   "OpenStreetMap",
                   "ESRI World Imagery"),
    overlayGroups = c("Circles"),
    # overlayGroups = c("Circles", "TESTER"),
    options = layersControlOptions(collapsed = TRUE)
  ) %>%
  setView(lng = -98.35, lat = 39.5, zoom = 4)
# hideGroup(c("Circles", "TESTER"))
# need to jitter coordinates by a few meters for repeats
'''

We then create the About page.

About {data-icon="fa-question-circle"}
===================================== 

Column {data-width=700}
-------------------------------------

###

**What is the purpose of this dashboard?**

This dashboard has two purposes:

+ Illustrate trends in school shootings
+ Demonstrate how to create a dashboard using `R`

**I want to learn how to create a dashboard just like this.**

Visit the *Tutorial* page of this dashboard to first learn the basics about building a dashboard.

At the end of the tutorial we provide a link to this [supplementary resource by the Open Case Studies project](INCLUDE LINK HERE).

We have included the source code (see upper right-hand corner) in this dashboard for more experienced `R` users looking to mimic some of what we did in this dashboard in their own.

**Disclaimer**

The purpose of the [Open Case Studies](https://opencasestudies.github.io){target="_blank"} project is **to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data**.

A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts. 

Column {data-width=300}
-------------------------------------

###

'''{r, echo=FALSE, fig.cap="[Photograph by Rubén Rodriguez](https://unsplash.com/photos/IXTvnOOSTyU)", out.width = '100%'}
knitr::include_graphics("nathan-dumlao-xPHmmVKS8lM-unsplash.jpg")
'''

We create a Tutorial page that links to this resource.

Tutorial {.storyboard data-icon="fa-list-ol"}
=========================================   

### **1)** Load the `flexdashboard` package.

Install the package if you don't have the package installed already

'''{r, echo=TRUE, eval=FALSE}
install.packages("flexdashboard")
install.packages("shiny")
'''

Once installed, the package is ready to be loaded into the `R` environment.

'''{r, echo=TRUE}
library(flexdashboard)
library(shiny)
'''

This all needs to be done separately in the `R` console.

### **2)** Create an `RMD` document.   

Dashboards can be created with `flexdashboard` in the `HTML` format. 

`flexdashboard` uses `RMarkdown` to produce dashboards that can contain `R` output.

This makes it possible to include several mediums in our dashboard such as plots created with `ggplot` or maps created with `leaflet`.
    
### **3)** Create an appropriate `YAML`.

The use of `flexdashboard` alters the way `RMarkdown` documents function. These altered functions are largely dependent on the metadata we use to produce the dashboard. Metadata for the dashboard can be configured in the `YAML` of the `RMD`. 

An `HTML` document created with `RMarkdown` includes a `YAML` that is some variation of this:

'''
---
title: "Untitled"
author: "Michael Ontiveros"
date: "8/12/2020"
output: html_document
---
'''

We used the following `YAML` for this dashboard:

'''
output: 
  flexdashboard::flex_dashboard:
    logo: https://icons.iconarchive.com/icons/icons8/windows-8/48/Programming-Dashboard-icon.png
    theme: readable
    orientation: columns
    source: embed
    vertical_layout: fill
runtime: shiny
'''

We introduce an icon, provide a theme with a color scheme, define the orientation (and thus order) of coded output, include the code used, limit scrolling, and allow `shiny` widgets to be used.

### **4)** Design the layout of the dashboard.

Dashboards are inherently visual, making this step the most time intensive after content creation. We need to present the data in a way that is both meaning and visually appealing.

On this dashboard, we wanted to present static plots of the United States and of individual states. We also wanted to display the locations of school shootings and provide some information about school shootings. Aside from being a dashboard, we wanted to create an educational resource that was reproducible for others. Lastly, as a sensitive topic, we wanted to raise awareness and provide information that could help others act.

Given these goals, we decided on the following page layout:

+ The Data
+ US Statistics
+ State Statistics
+ Map
+ About
+ Tutorial
+ Hotline
+ Source Code

This layout ensured that we did to not include too many components.

The first page gives users to the opportunity to look at the data themselves. More complicated components such as the map of each incident were left alone on a single page. US and state-level statistics were separated from one another. This short tutorial on how to create the dashboard and source code were included in the dashboard with programmers at all levels in mind. The goals of the dashboard and actionable information were each given separate pages from the output. 

For your dashboard, this may take as long as the output you would like to share took you to produce. 

### **5)** Add content to the dashboard.

You can begin adding content to the dashboard once you have an initial layout in mind. Keep in mind that this will likely be an iterative process. 

The `RMarkdown` file used to create a dashboard with `flexdashboard` works similarly to any other `RMarkdown`. There are some exceptions.

'''{r, echo = TRUE}
# This output was created with chunk options: {r, echo = TRUE}
paste("Code chunks can be explicitly included")
'''

'''{r}
# This output was created with chunk options: {r}
paste("Code chunks are hidden by default")
'''

Pages and columns within pages can be defined.

'''
Page
=========================================   

Column {data-width=500}
-------------------------------------

Column {data-width=500}
-------------------------------------
'''

As mentioned before, the `flexdashboard` metadata included in the `YAML` does also alter how `RMarkdown` functions. For more on how you can leverage both `RMarkdown` and `flexdashboard` to produce a dashboard, click [here](https://rmarkdown.rstudio.com/flexdashboard/index.html).

This [supplementary resource by the Open Case Studies project](INCLUDE LINK HERE) provides a case study on how to create this very dashboard in more detail.

Lastly, we create a Hotline page to spread awareness.

Hotline {data-icon="fa-exclamation-triangle"}
=========================================   

Column {data-width=600}
-------------------------------------

###

**Warning Signs**

From [Sandy Hook Promise](https://www.sandyhookpromise.org/gun-violence/know-the-signs-of-gun-violence/)...

avocado... there were some really interesting things here... but dont know where/if to include
https://www.sandyhookpromise.org/gun-violence/16-facts-about-gun-violence-and-school-shootings/

The most important seems to be that shooters usually warn someone

<style>
div.blue { background-color:#e6f0ff; border-radius: 5px; padding: 20px;}
</style>
<div class = "blue">

Here is a list of potential warning signs that can signal an individual may be in crisis and/or need help:

+ Suddenly withdrawing from people and activities
+ Consistent bullying or intimidating others, or being bullied by others
+ Extreme mood or personality changes
+ Victim of constant social rejection
+ Talking about plans or actively making plans to harm themselves or others
+ Bringing a weapon to school – or threatening or talking about doing so
+ Bragging about or warning others about an upcoming act of violence
+ Recruiting others to join in a planned act of violence
+ Warning students to stay away from school or events
+ Expressing fascination with guns and/or school shootings
+ Expressing hopelessness about the future
+ Extreme, prolonged sadness or distress
+ Expressing or showing feelings of isolation
+ Bragging about access to guns

**NOTE**

This list is not a comprehensive list of warning signs nor does exhibiting one of these signs indicate imminent violence.

When concerned about seeing troubling behaviors, tell a trusted adult or call 911, if there is an immediate threat.

</div>

Column {data-width=400}
-------------------------------------

### 

**Respond to Warning Signs**

Call 911 if you feel there is an immediate threat. 

Call [+1-844-5-SAYNOW](tel:18445729669) if you would to submit an anonymous safety concern.

Summary


Summary Plot

Synopsis

Suggested Homework


Create another dashboard with graphs and statistics featuring other elements within this dataset. For example, students may create graphs that explore what school events are reported to have more shootings.

Additional Information


Session Info

R version 4.0.1 (2020-06-06)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Mojave 10.14.5

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] vembedr_0.1.3       maps_3.3.0          ggforce_0.3.1      
 [4] DT_0.14             lubridate_1.7.8     htmltools_0.4.0    
 [7] rmapshaper_0.4.4    leaflet_2.0.3       stringr_1.4.0      
[10] purrr_0.3.4         tibble_3.0.1        tidyverse_1.3.0    
[13] shiny_1.4.0.2       flexdashboard_0.5.2 waffle_0.7.0       
[16] forcats_0.5.0       sf_0.9-3            ggmap_3.0.0        
[19] ggplot2_3.3.1       magrittr_1.5        tidyr_1.1.0        
[22] dplyr_1.0.0         readr_1.3.1         knitr_1.28         
[25] here_0.1           

loaded via a namespace (and not attached):
 [1] colorspace_1.4-1    rjson_0.2.20        ellipsis_0.3.1     
 [4] class_7.3-17        rprojroot_1.3-2     base64enc_0.1-3    
 [7] fs_1.4.1            rstudioapi_0.11     httpcode_0.3.0     
[10] farver_2.0.3        fansi_0.4.1         xml2_1.3.2         
[13] extrafont_0.17      polyclip_1.10-0     geojsonlint_0.4.0  
[16] jsonlite_1.6.1      broom_0.5.6         Rttf2pt1_1.3.8     
[19] dbplyr_1.4.4        png_0.1-7           compiler_4.0.1     
[22] httr_1.4.1          backports_1.1.7     assertthat_0.2.1   
[25] fastmap_1.0.1       cli_2.0.2           later_1.1.0.1      
[28] tweenr_1.0.1        tools_4.0.1         gtable_0.3.0       
[31] glue_1.4.1          V8_3.2.0            Rcpp_1.0.4.6       
[34] cellranger_1.1.0    vctrs_0.3.1         crul_1.0.0         
[37] nlme_3.1-148        extrafontdb_1.0     crosstalk_1.1.0.1  
[40] xfun_0.14           rvest_0.3.5         mime_0.9           
[43] lifecycle_0.2.0     MASS_7.3-51.6       scales_1.1.1       
[46] hms_0.5.3           promises_1.1.1      RColorBrewer_1.1-2 
[49] yaml_2.2.1          curl_4.3            gridExtra_2.3      
[52] stringi_1.4.6       jsonvalidate_1.1.0  highr_0.8          
[55] e1071_1.7-3         RgoogleMaps_1.4.5.3 rlang_0.4.6        
[58] pkgconfig_2.0.3     bitops_1.0-6        evaluate_0.14      
[61] lattice_0.20-41     htmlwidgets_1.5.1   labeling_0.3       
[64] tidyselect_1.1.0    plyr_1.8.6          R6_2.4.1           
[67] generics_0.0.2      DBI_1.1.0           pillar_1.4.4       
[70] haven_2.3.1         withr_2.2.0         units_0.6-6        
[73] sp_1.4-2            modelr_0.1.8        crayon_1.3.4       
[76] KernSmooth_2.23-17  utf8_1.1.4          rmarkdown_2.2      
[79] jpeg_0.1-8.1        grid_4.0.1          readxl_1.3.1       
[82] blob_1.2.1          reprex_0.3.0        digest_0.6.25      
[85] classInt_0.4-3      xtable_1.8-4        httpuv_1.5.4       
[88] munsell_0.5.0       viridisLite_0.3.0  

Acknowledgements

We would like to acknowledge Elizabeth Stuart for assisting in framing the major direction of the case study.

We would also like to acknowledge the Bloomberg American Health Initiative for funding this work.

LS0tCnRpdGxlOiAiRmlmdHkgWWVhcnMgb2YgU2Nob29sIFNob290aW5ncyBpbiB0aGUgVW5pdGVkIFN0YXRlcyIKY3NzOiBzdHlsZS5jc3MKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBzZWxmX2NvbnRhaW5lZDogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKCi0tLQoKPHN0eWxlPgojVE9DIHsKICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pby9pbWcvbG9nby5qcGciKTsKICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CiAgcGFkZGluZy10b3A6IDI0MHB4ICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQo8L3N0eWxlPgoKCjwhLS0gT3BlbiBhbGwgbGlua3MgaW4gbmV3IHRhYi0tPiAgCjxiYXNlIHRhcmdldD0iX2JsYW5rIi8+IAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gVFJVRSwgY29tbWVudCA9IE5BLCBlY2hvID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBjYWNoZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICc5MCUnKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoa25pdHIpCmBgYAoKIyMjIyB7Lm91dGxpbmUgfQpgYGB7ciwgZWNobz1GQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgic2NyZWVuc2hvdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5hbF9wbG90LnBuZyIpKQpgYGAKIyMjIwoKIyMjIyB7LmRpc2NsYWltZXJfYmxvY2t9CgoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiAKCiMjIyMKCiMjIyMgey5saWNlbnNlX2Jsb2NrfQoKVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIFsoQ0MgQlktTkMgMy4wKV0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLzMuMC91cy8pe3RhcmdldD0iX2JsYW5rIn0gVW5pdGVkIFN0YXRlcyBMaWNlbnNlLgoKIyMjIwoKIyMjIyB7LnJlZmVyZW5jZV9ibG9ja30KClRvIGNpdGUgdGhpcyBjYXNlIHN0dWR5IHBsZWFzZSB1c2U6CgpXcmlnaHQsIENhcnJpZSwgYW5kIE9udGl2ZXJvcywgTWljaGFlbCBhbmQgSmFnZXIsIExlYWggYW5kIFRhdWIsIE1hcmdhcmV0IGFuZCBIaWNrcywgU3RlcGhhbmllLiAoMjAyMCkuIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuY2FzZXN0dWRpZXMvb2NzLXlvdXRoLXNjaG9vbC1zaG9vdGluZ3MtZGFzaGJvYXJkLWNhc2Utc3R1ZHkuIEZpZnR5IFllYXJzIG9mIFNjaG9vbCBTaG9vdGluZ3MgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgKFZlcnNpb24gdjEuMC4wKS4KCiMjIyMKCiMjICoqTW90aXZhdGlvbioqCioqKiAKClRoaXMgY2FzZSBzdHVkeSBpcyBtb3RpdmF0ZWQgYnkgdGhpcyBbYXJ0aWNsZV0oaHR0cHM6Ly9saW5rLnNwcmluZ2VyLmNvbS9jb250ZW50L3BkZi8xMC4xMDA3L3MxMTkyMC0wMTItMDMzMS02LnBkZik6CgojIyMjIHsucmVmZXJlbmNlX2Jsb2NrfQoKRmxhbm5lcnksIEQuIEouLCBNb2R6ZWxlc2tpLCBXLiAmIEtyZXRzY2htYXIsIEouIE0uIFZpb2xlbmNlIGFuZCBTY2hvb2wgU2hvb3RpbmdzLiBDdXJyIFBzeWNoaWF0cnkgUmVwIDE1LCAzMzEgKDIwMTMpLiBET0k6IFsxMC4xMDA3L3MxMTkyMC0wMTItMDMzMS02XShodHRwczovL2RvaS5vcmcvMTAuMTAwNy9zMTE5MjAtMDEyLTAzMzEtNikKCiMjIyMKClRoaXMgYXJ0aWNsZSBleHBsb3JlcyBjaGFyYWN0ZXJpc3RpY3Mgb2Ygc2Nob29sIHNob290aW5ncyBhbmQgdmlvbGVuY2UgaW4gc2Nob29scyBhbmQgZGlzY3Vzc2VzIHdoeSB0aGVzZSBldmVudHMgbWF5IG9jY3VyLCBhcyB3ZWxsIGFzIHRoZWlyIGltcGFjdCBvbiB0aGUgY29tbXVuaXRpZXMgaW4gd2hpY2ggdGhleSBvY2N1ci4KCgoKVGhpcyBhcnRpY2xlIHN0YXRlcyB0aGF0IHRoZSBzaG9vdGVycyBvZiBtb3N0IGNvbW1vbmx5IHdoaXRlIG1hbGVzLCBidXQgdGhhdCBtYW55IHByZXZpb3VzIHN0dWRpZXMgb2Ygc2hvb3RlciBjaGFyYWN0ZXJpc2l0Y3MgY291bGQgbm90IGlkZW50aWZ5IGFueSBwYXJ0aWN1bGFyICJwcm9maWxlIiBvZiBzaG9vdGVycy4KCj4gIlRvIGRhdGUsIHN0dWRpZXMgb2Ygc2Nob29sIHNob290aW5ncyBoYXZlIGNvbmNsdWRlZCB0aGF0IG5vCmNvbnNpc3RlbnQgYW5kIHJlbGlhYmxlIHByb2ZpbGUgb2Ygc2Nob29sIHNob290ZXJzIGV4aXN0LCBhbmQKbW9zdCByZXNlYXJjaGVycyBhbmQgY2xpbmljaWFucyB3b3VsZCBhZ3JlZSB0aGF0IHByZWRpY3RpbmcKdmlvbGVudCBiZWhhdmlvciBpcyBhIHNsaXBwZXJ5IHNsb3BlIHRoYXQgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbgptb3JlIGZhbHNlIHBvc2l0aXZlcyB0aGFuIGZhbHNlIG5lZ2F0aXZlcy4iCgpIb3dldmVyIHByZXZpb3VzIHN0dWRpZXMgbm90ZSBzb21lIGNvbW1vbmFsaXRlcyBzdWNoIGFzOgoKPiAiLi4ubW9zdCBzaG9vdGVycyB3ZXJlIGRlcHJlc3NlZCwgaGFkIGV4cGVyaWVuY2VkIHNvbWUgc2lnbmlmaWNhbnQKbG9zcywgZmVsdCBwZXJzZWN1dGVkIG9yIGJ1bGxpZWQgYnkgb3RoZXJzLCBhbmQgaGFkIHByaW9yCmRpZmZpY3VsdHkgY29waW5nIG9yIGhhZCBwcmV2aW91c2x5IHRyaWVkIHN1aWNpZGUuIE1vc3Qgb2YKdGhlIHNob290ZXJzIGRpZCBub3QsIGhvd2V2ZXIsIGhhdmUgYSBoaXN0b3J5IG9mIGRydWcgYWJ1c2UKb3IgdmlvbGVuY2Ugb3IgY3J1ZWx0eSB0byBhbmltYWxzLCBjb21tb24gcHN5Y2hpYXRyaWMgaW5kaWNhdG9ycyBvZiByaXNrLCBub3IgZGlkIHRoZXkgcmVwb3J0IGV4Y2Vzc2l2ZSBleHBvc3VyZSB0bwp2aW9sZW5jZSBpbiB0aGUgbWVkaWEgKHRob3VnaCBtYW55IHByb2R1Y2VkIHRoZWlyIG93bgp2aW9sZW50IHRoZW1lcyBpbiB3cml0aW5ncyBvciBkcmF3aW5ncykuIgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0gIjYwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJqb3NodWEtaG9laG5lLUNBb2tneDFHR0tFLXVuc3BsYXNoLmpwZyIpKQpgYGAKCgo8c3Bhbj5QaG90byBieSA8YSBocmVmPSJodHRwczovL3Vuc3BsYXNoLmNvbS9AbXJ0aGV0cmFpbj91dG1fc291cmNlPXVuc3BsYXNoJmFtcDt1dG1fbWVkaXVtPXJlZmVycmFsJmFtcDt1dG1fY29udGVudD1jcmVkaXRDb3B5VGV4dCI+Sm9zaHVhIEhvZWhuZTwvYT4gb24gPGEgaHJlZj0iaHR0cHM6Ly91bnNwbGFzaC5jb20vcy9waG90b3MvaGlnaC1zY2hvb2w/dXRtX3NvdXJjZT11bnNwbGFzaCZhbXA7dXRtX21lZGl1bT1yZWZlcnJhbCZhbXA7dXRtX2NvbnRlbnQ9Y3JlZGl0Q29weVRleHQiPlVuc3BsYXNoPC9hPjwvc3Bhbj4KCgoKPiAiU2Nob29sIHNob290aW5ncyBhcmUgbm90IGFsbCB0aGUgc2FtZSBhbmQgbWF5IHJlcXVpcmUKZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gcHJldmVudGlvbiBhbmQgdHJlYXRtZW50LCBlc3BlY2lhbGx5CndpdGggcmVzcGVjdCB0byBpZGVudGlmeWluZyByaXNrIGZhY3RvcnMgYXQgdGhlIGluZGl2aWR1YWwsIHNjaG9vbApvciBjb21tdW5pdHkgbGV2ZWxzLCBhbmQgcGFydGljdWxhcmx5IHdpdGggcmVnYXJkIHRvIGV4YW1pbmluZwp0aGUgcm9sZSB0aGF0IG1lbnRhbCBoZWFsdGggaXNzdWVzIG1heSBwbGF5IHRvIGluY3JlYXNlIHJpc2sgZm9yCnBlcnBldHJhdGlvbi4gVGhlIGZpZWxkICoqbmVlZHMgdG8ga25vdyBtb3JlKiogYWJvdXQgc2hvb3RpbmcKaW5jaWRlbnRzIHRoYXQgYXJlIGF2ZXJ0ZWQsIHRob3NlIHRoYXQgcmVzdWx0IGluIGluanVyeSBidXQgbm90CmRlYXRoIGFuZCBhYm91dCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBtb3JlIGNvbW1vbiBvY2N1cnJlbmNlIG9mIHNpbmdsZSBob21pY2lkZSBzY2hvb2wgc2hvb3RpbmdzLiIKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9ICI2MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiYW5kcmUtaHVudGVyLUFROTA4RmZkQU13LXVuc3BsYXNoLmpwZyIpKQpgYGAKCjxzcGFuPlBob3RvIGJ5IDxhIGhyZWY9Imh0dHBzOi8vdW5zcGxhc2guY29tL0BkcmUwMzE2P3V0bV9zb3VyY2U9dW5zcGxhc2gmYW1wO3V0bV9tZWRpdW09cmVmZXJyYWwmYW1wO3V0bV9jb250ZW50PWNyZWRpdENvcHlUZXh0Ij5BbmRyZSBIdW50ZXI8L2E+IG9uIDxhIGhyZWY9Imh0dHBzOi8vdW5zcGxhc2guY29tL3MvcGhvdG9zL2hpZ2gtc2Nob29sP3V0bV9zb3VyY2U9dW5zcGxhc2gmYW1wO3V0bV9tZWRpdW09cmVmZXJyYWwmYW1wO3V0bV9jb250ZW50PWNyZWRpdENvcHlUZXh0Ij5VbnNwbGFzaDwvYT48L3NwYW4+CgoKVGhleSBhbHNvIHBvaW50IG91dCB0aGF0OgoKPiAiTW9zdCBtZWRpYSBhdHRlbnRpb24gaXMgb24gdGhlIG1lbnRhbCBoZWFsdGggb2Ygc2Nob29sIHNob290ZXJzLCBidXQgd2UgY2Fubm90IGZvcmdldCB0aGUgKippbXBhY3Qgb2Ygc2Nob29sIHNob290aW5nIGluY2lkZW50cyBvbiB0aGUgc3Vydml2aW5nIHZpY3RpbXMqKiwgaW5jbHVkaW5nIHRob3NlIHdobyBtYXkgbm90IGhhdmUgYmVlbiBpbmp1cmVkIGJ1dCB3aG8gbWF5IGhhdmUgd2l0bmVzc2VkIHRoZSBpbmNpZGVudCBvciBiZWVuIGFmZmVjdGVkIGJ5IGl0IGluIG90aGVyIHdheXMuIFBzeWNoaWF0cmlzdHMgbXVzdCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBsb25nLXRlcm0gbWVudGFsIGhlYWx0aCBjb25zZXF1ZW5jZXMgb2YgdGhlc2UgaW5jaWRlbnRzIG9uIGFsbCBhZmZlY3RlZCBwYXJ0aWVzIChub3QganVzdCBmb3JtYWwgUFRTRCBkaWFnbm9zZXMsIGJ1dCByZWxhdGVkIHRyYXVtYSBzeW1wdG9tcykgYXMgd2VsbCBhcyBtYWxhZGFwdGl2ZSBjb3Bpbmcgc3RyYXRlZ2llcyB0aGF0IHNvbWUgbWF5IGVtcGxveSBpbiByZXNwb25zZSB0byBzdWNoIHVucHJlZGljdGFibGUsIHRyYWdpYyBldmVudHMuIgoKR2l2ZW4gdGhpcyBuZWVkIGZvciBtb3JlIHJlc2VhcmNoIHRvIGJldHRlciB1bmRlcnN0YW5kIHdoeSB0aGVzZSBldmVudHMgb2NjdXIgYW5kIGhvdyB0aGV5IGNvdWxkIGJlIGF2ZXJ0ZWQsIGluIHRoaXMgY2FzZSBzdHVkeSB3ZSB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSByZXNvdXJjZSBmb3Igb3RoZXJzIHRvIG1vcmUgZWFzaWx5IGFuZCBpbnRlcmFjdGl2ZWx5IGFjY2VzcyBkYXRhIGFib3V0IHNjaG9vbCBzaG9vdGluZ3MuIFRvIGRvIHNvIHdlIHdpbGwgY3JlYXRlIHdoYXQgaXMgY2FsbGVkIGEgW2Rhc2hib2FyZF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGFzaGJvYXJkXyhidXNpbmVzcykpLCB3aGljaCBpcyBhIHdlYnNpdGUgdGhhdCBkaXNwbGF5cyBhIHJlcG9ydCBmb3IgYSBkYXRhYmFzZS4gRGFzaGJvYXJkcyBzdW1tYXJpemUgdGhlIGRhdGEgaW4gYSBkYXRhYmFzZSBhbmQgdHlwaWNhbGx5IGFsbG93IGZvciB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHRoZSBkYXRhIGluIHNvbWUgd2F5LgoKW0hlcmVdKGh0dHBzOi8vYmV0YS5yc3R1ZGlvY29ubmVjdC5jb20vamphbGxhaXJlL2h0bWx3aWRnZXRzLWhpZ2hjaGFydGVyLykgeW91IGNhbiBzZWUgYW4gZXhhbXBsZSBvZiBhIGRhc2hib2FyZCBjcmVhdGVkIGluIFIuCgoKYGBge3J9CmtuaXRyOjppbmNsdWRlX3VybCgiaHR0cHM6Ly9iZXRhLnJzdHVkaW9jb25uZWN0LmNvbS9qamFsbGFpcmUvaHRtbHdpZGdldHMtaGlnaGNoYXJ0ZXIvIikKYGBgCk9uIHRoZSB3ZWJzaXRlIHRoZSB0YWJzIGFuZCBhbmQgcGxvdHMgYXJlIGludGVyYWN0aXZlLiBUaGUgZGFzaGJvYXJkIGFsbG93cyBmb3IgdXNlcnMgdG8gZ2V0IHRvIGtub3cgdGhlIGRhdGEgaW4gYSBzaW1wbGUgYW5kIHF1aWNrIHdheS4KClRoZSBkYXRhIGFib3V0IGZvb2Qgc2FsZXMgIGlzIHN1Y2NpbmN0bHkgc3VtbWFyaXplZCBpbiBhbiBpbXBhY3RmdWwgbWFubmVyLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSAiNjAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImRhc2hib2FyZC5wbmciKSkKYGBgCgojIyMjW1tzb3VyY2VdXShodHRwczovL2JldGEucnN0dWRpb2Nvbm5lY3QuY29tL2pqYWxsYWlyZS9odG1sd2lkZ2V0cy1oaWdoY2hhcnRlci8pCgpOb3cgbGV0J3MgbGVhcm4gaG93IHRvIGRvIHRoaXMgd2l0aCBvdXIgZGF0YSBvZiBpbnRlcmVzdC4KCiMjICoqTWFpbiBRdWVzdGlvbnMqKgoqKiogCgojIyMjIHsubWFpbl9xdWVzdGlvbl9ibG9ja30KPGI+PHU+IE91ciBtYWluIHF1ZXN0aW9uczogPC91PjwvYj4KCjEpIFdoYXQgaGFzIGJlZW4gdGhlIHllYXJseSByYXRlIG9mIHNjaG9vbCBzaG9vdGluZ3MgYW5kIHdoZXJlIGhhdmUgdGhleSBvY2N1cnJlZCBpbiB0aGUgbGFzdCA1MCB5ZWFycyAoZnJvbSBKYW51YXJ5IDE5NzAgdG8gSnVuZSAyMDIwKT8gCgoyKSBXaGF0IGFyZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZXNlIGV2ZW50cz8KCiMjIyMKCiMjICoqTGVhcm5pbmcgT2JqZWN0aXZlcyoqIAoqKiogCgpJbiB0aGlzIGNhc2Ugc3R1ZHksIHdlIHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIFtkYXNoYm9hcmRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Rhc2hib2FyZF8oYnVzaW5lc3MpKSwgd2hpY2ggaXMgYSB3ZWJzaXRlIHRoYXQgZGlzcGxheXMgYSByZXBvcnQgYWJvdXQgYSBkYXRhYmFzZS4gV2Ugd2lsbCBlc3BlY2lhbGx5IGZvY3VzIG9uIHVzaW5nIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMgZnJvbSB0aGUgW2BUaWR5dmVyc2VgXShodHRwczovL3d3dy50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSwgc3VjaCBhcyBgcGFja2FnZV9uYW1lYCwgYHBhY2thZ2VfbmFtZWAuIFRoZSB0aWR5dmVyc2UgaXMgYSBsaWJyYXJ5IG9mIHBhY2thZ2VzIGNyZWF0ZWQgYnkgUlN0dWRpby4gV2hpbGUgc29tZSBzdHVkZW50cyBtYXkgYmUgZmFtaWxpYXIgd2l0aCBwcmV2aW91cyBSIHByb2dyYW1taW5nIHBhY2thZ2VzLCB0aGVzZSBwYWNrYWdlcyBtYWtlIGRhdGEgc2NpZW5jZSBpbiBSIG1vcmUgbGVnaWJsZSBhbmQgaW50dWl0aXZlLgoKCmBgYHtyLCBvdXQud2lkdGggPSAiMjAlIiwgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ24gPSJjZW50ZXIifQppbmNsdWRlX2dyYXBoaWNzKCJodHRwczovL3RpZHl2ZXJzZS50aWR5dmVyc2Uub3JnL2xvZ28ucG5nIikKYGBgCgpUaGUgc2tpbGxzLCBtZXRob2RzLCBhbmQgY29uY2VwdHMgdGhhdCBzdHVkZW50cyB3aWxsIGJlIGZhbWlsaWFyIHdpdGggYnkgdGhlIGVuZCBvZiB0aGlzIGNhc2Ugc3R1ZHkgYXJlOgoKQXZvY2FkbyB1cGRhdGUgaGVyZSBhbmQgaW4gcmVhZG1lIQoKRGF0YSBzY2llbmNlIHNraWxsczogIAoKMS4gSW1wb3J0aW5nIHRleHQgZnJvbSBhIGdvb2dsZSBzaGVldHMgZG9jdW1lbnQ/Pz8KMi4gQXBwbHkgYWN0aW9uIHZlcmJzIGluIGBkcGx5cmAgZm9yIGRhdGEgd3JhbmdsaW5nICAKMy4gSG93IHRvIHJlc2hhcGUgZGF0YSBieSBwaXZvdGluZyBiZXR3ZWVuICJsb25nIiBhbmQgIndpZGUiIGZvcm1hdHMgYW5kIHNlcGFyYXRpbmcgY29sdW1ucyBpbnRvIGFkZGl0aW9uYWwgY29sdW1ucyAoYHRpZHlyYCkgIAo0LiBIb3cgdG8gZmlsbCBpbiBkYXRhIGJhc2VkIG9uIHByZXZpb3VzIHZhbHVlcyAoYHRpZHlyYCkKNS4gSG93IHRvIGNyZWF0ZSBkYXRhIHZpc3VhbGl6YXRpb25zIHdpdGggYGdncGxvdDJgIHRoYXQgYXJlIGluIGEgc2ltaWxhciBzdHlsZSB0byBhbiBleGlzdGluZyBpbWFnZSAgICAKNi4gSG93IHRvIGFkZCBpbWFnZXMgdG8gcGxvdHMgdXNpbmcgYGNvd3Bsb3RgCjcuIEhvdyB0byBjcmVhdGUgZWZmZWN0aXZlIGJhciBwbG90cyB0byBmb3IgbXVsdGlwbGUgY29tcGFyaXNvbnMsIGluY2x1ZGluZyBhZGRpbmcgZ2FwcyBiZXR3ZWVuIGJhcnMgaW4gYmFyIHBsb3RzLCBhZGRpbmcgZmlndXJlIGxlZ2VuZHMgdG8gdGhlIHBsb3QgYXJlYSwgYW5kIGFkZGluZyBjb21wYXJpc29uIGxpbmVzIChgZ2dwbG90MmApCgpTdGF0aXN0aWNhbCBjb25jZXB0cyBhbmQgbWV0aG9kczogIAoKCioqKiAKCgpXZSB3aWxsIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIHBhY2thZ2VzIHRoYXQgd2Ugd2lsbCBuZWVkOgoKCmBgYHtyfQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoZ2dtYXApCmxpYnJhcnkoc2YpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShmb3JjYXRzKQpsaWJyYXJ5KHdhZmZsZSkKbGlicmFyeShmbGV4ZGFzaGJvYXJkKQpsaWJyYXJ5KHNoaW55KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsZWFmbGV0KQoKbGlicmFyeShybWFwc2hhcGVyKQpsaWJyYXJ5KGh0bWx0b29scykKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoRFQpCmBgYAoKCiA8dT4qKlBhY2thZ2VzIHVzZWQgaW4gdGhpcyBjYXNlIHN0dWR5OioqIDwvdT4KClBhY2thZ2UgICB8IFVzZSBpbiB0aGlzIGNhc2Ugc3R1ZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS0KW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qZW5ueWJjL2hlcmVfaGVyZSl7dGFyZ2V0PSJfYmxhbmsifSAgICAgICB8IHRvIGVhc2lseSBsb2FkIGFuZCBzYXZlIGRhdGEgIApbcmVhZHJdKGh0dHBzOi8vcmVhZHIudGlkeXZlcnNlLm9yZy8pIHwgIHRvIGltcG9ydCB0aGUgZGF0YSAgICAKW2RwbHlyXShodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBmaWx0ZXIsIHN1YnNldCwgam9pbiwgYWRkIHJvd3MgdG8sIGFuZCBtb2RpZnkgdGhlIGRhdGEgICAgCltzdHJpbmdyXShodHRwczovL3N0cmluZ3IudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIG1hbmlwdWxhdGUgIGNoYXJhY3RlciBzdHJpbmdzIHdpdGhpbiB0aGUgZGF0YQpbbWFncml0dHJdKGh0dHBzOi8vbWFncml0dHIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIHBpcGUgc2VxdWVudGlhbCBjb21tYW5kcyAKW2dnbWFwXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZ2dtYXAvZ2dtYXAucGRmKSB8IHRvIGdlb2NvZGUgdGhlIGRhdGEgKHdoaWNoIG1lYW5zIGdldCB0aGUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSB2YWx1ZXMgZm9yIHRoZSBzY2hvb2xzKQpbd2FmZmxlXShodHRwczovL2dpdGh1Yi5jb20vaHJicm1zdHIvd2FmZmxlKSB8IHRvIG1ha2Ugd2FmZmxlIHByb3BvcnRpb24gcGxvdApbZmxleGRhc2hib2FyZF0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vZmxleGRhc2hib2FyZC8pICAgICB8IHRvIGNyZWF0ZSB0aGUgZWxlbWVudHMgb2YgdGhlIGRhc2hib2FyZCAKClt0aWR5cl0oaHR0cHM6Ly90aWR5ci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gY2hhbmdlIHRoZSBzaGFwZSBvciBmb3JtYXQgb2YgdGliYmxlcyB0byB3aWRlIGFuZCBsb25nLCB0byBkcm9wIHJvd3Mgd2l0aCBgTkFgIHZhbHVlcywgdG8gc2VwYXJhdGUgYSBjb2x1bW4gaW50byBhZGRpdGlvbmFsIGNvbHVtbnMsIGFuZCB0byBmaWxsIG91dCB2YWx1ZXMgYmFzZWQgb24gcHJldmlvdXMgdmFsdWVzICAgCltzaGlueV0oaHR0cHM6Ly9zaGlueS5yc3R1ZGlvLmNvbS8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGFsbG93IG91ciBkYXNoYm9hcmQgdG8gYmUgaW50ZXJhY3RpdmUgIApbbGVhZmxldF0oaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9sZWFmbGV0L3NoaW55Lmh0bWwpIHwgdG8gaW1wbGVtZW50IHRoZSBbbGVhZmxldF0oaHR0cDovL2xlYWZsZXRqcy5jb20vKSAoYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIG1hcHMpIHRvIGNyZWF0ZSB0aGUgbWFwIGZvciBvdXIgZGFzaGJvYXJkICAgCltzZl0oaHR0cHM6Ly9yLXNwYXRpYWwuZ2l0aHViLmlvL3NmLykgfCB0byBHZW9jb2RlIHRoZSBkYXRhIGF2b2NhZG8KW3JtYXBzaGFwcGVyXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcm1hcHNoYXBlci92aWduZXR0ZXMvcm1hcHNoYXBlci5odG1sKSB8IGF2b2NhZG8KW2h0bWx0b29sc10oaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL2h0bWx0b29scy92ZXJzaW9ucy8wLjUuMCkgfCB0byBhdm9jYWRvICAgCltsdWJyaWRhdGVdKGh0dHBzOi8vbHVicmlkYXRlLnRpZHl2ZXJzZS5vcmcvKSB8IHRvIHdvcmsgd2l0aCB0aGUgZGF0YS10aW1lIGRhdGEgICAgCltEVF0oaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9EVC8pIHwgdG8gY3JlYXRlIHRoZSBpbnRlcmFjdGl2ZSB0YWJsZSAgCltnZ3Bsb3QyXShodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGNyZWF0ZSBwbG90cyAgCltkaXJlY3RsYWJlbHNdKGh0dHA6Ly9kaXJlY3RsYWJlbHMuci1mb3JnZS5yLXByb2plY3Qub3JnL2RvY3MvaW5kZXguaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gYWRkIGxhYmVscyBkaXJlY3RseSB0byBsaW5lcyBpbiBwbG90cyAgCltjb3dwbG90XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvY293cGxvdC92aWduZXR0ZXMvaW50cm9kdWN0aW9uLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGFkZCBpbWFnZXMgdG8gcGxvdHMgCltmb3JjYXRzXShodHRwczovL2ZvcmNhdHMudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIHJlb3JkZXIgZmFjdG9yIGZvciBwbG90CgpbcGF0Y2h3b3JrXShodHRwczovL2dpdGh1Yi5jb20vdGhvbWFzcDg1L3BhdGNod29yaykgfCB0byBjb21iaW5lIHBsb3RzCgoKClRoZSBmaXJzdCB0aW1lIHdlIHVzZSBhIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSB0aGUgYDo6YCB0byBpbmRpY2F0ZSB3aGljaCBwYWNrYWdlIHdlIGFyZSB1c2luZy4gVW5sZXNzIHdlIGhhdmUgb3ZlcmxhcHBpbmcgZnVuY3Rpb24gbmFtZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IHdlIHdpbGwgaW5jbHVkZSBpdCBoZXJlIHRvIGJlIGluZm9ybWF0aXZlIGFib3V0IHdoZXJlIHRoZSBmdW5jdGlvbnMgd2Ugd2lsbCB1c2UgY29tZSBmcm9tLgoKCiMjICoqQ29udGV4dCoqCioqKiAKCkFsdGhvdWdoIHNjaG9vbCBzaG9vdGluZyBldmVudHMgdGhhdCByZXN1bHQgaW4gaG9taWNpZGUgYXJlIHJhcmUsIHRoZXkgY2FuIGhhdmUgYSBsYXN0aW5nIGltcGFjdCBvbiB0aGUgY29tbXVuaXRpZXMgaW4gd2hpY2ggdGhleSBvY2N1ci4gRnVydGhlcm1vcmUsIHN1aWNpZGUgZXZlbnRzIGFuZCBzaG9vdGluZ3Mgd2l0aCBubyB2aWN0aW1zIGNhbiBhbHNvIGJlIGltcGFjdGZ1bC4KCkFjY29yZGluZyB0byB0aGUgW0NlbnRlciBmb3IgSW5qdXJ5IFJlc2VhcmNoIGFuZCBQcmV2ZW50aW9uIGF0IHRoZSBDaGlsZHJlbidzIEhvc3BpdGFsIG9mIFBoaWxhZGVscGhpYV0oaHR0cHM6Ly9pbmp1cnkucmVzZWFyY2guY2hvcC5lZHUvdmlvbGVuY2UtcHJldmVudGlvbi1pbml0aWF0aXZlL3R5cGVzLXZpb2xlbmNlLWludm9sdmluZy15b3V0aC9zY2hvb2wtc2hvb3RpbmdzKToKCj5UaGUgbW9zdCBjb21tb24gc2hvb3RpbmdzIG9uIHNjaG9vbCBncm91bmRzIHJhcmVseSBpbnZvbHZlIGxhcmdlIG51bWJlcnMgb2YgdmljdGltcywgYnV0IGV2ZW4gYSBzaG9vdGluZyBvZiBqdXN0IG9uZSBzdHVkZW50IGF0IHNjaG9vbCBoYXMgcmFtaWZpY2F0aW9ucyBmYXIgYmV5b25kIHRob3NlIGRpcmVjdGx5IGludm9sdmVkLiBTdHVkZW50cyBhbmQgc3RhZmYgdGhhdCB3aXRuZXNzIHNjaG9vbCBzaG9vdGluZ3MgYXJlIGxpa2VseSB0byBzdWZmZXIgZnJvbSBbdHJhdW1hdGljIHN0cmVzc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJhdW1hdGljX3N0cmVzcykgc3ltcHRvbXMsIGJlY29tZSBhbnhpb3VzIG9yIGRlcHJlc3NlZCBhbmQgaGF2ZSBnZW5lcmFsIGNvbmNlcm5zIGFib3V0IHRoZWlyIHNhZmV0eS4gV2hpbGUgbWFueSB3aXRuZXNzZXMgd2lsbCBoYXZlIHRlbXBvcmFyeSBzeW1wdG9tcywgb3RoZXJzIHdpbGwgYmUgc3ltcHRvbWF0aWMgZm9yIGEgbXVjaCBsb25nZXIgcGVyaW9kIG9mIHRpbWUgYW5kIGV2ZW4gZGV2ZWxvcCBjaHJvbmljIHBzeWNoaWF0cmljIGRpc29yZGVycy4gRXZlbiBzaG9ydC10ZXJtIGltcGFpcm1lbnRzIGNhbiBjYXVzZSBzZXZlcmUgZGlzdHJlc3MgYW5kIGhhdmUgcHJvZm91bmQgZWZmZWN0cyBvbiBhY2FkZW1pYyBhY2hpZXZlbWVudCBhbmQgdGhlIHNvY2lhbCBhbmQgZW1vdGlvbmFsIGdyb3d0aCBvZiBpbXBhY3RlZCBzdHVkZW50cy4gCiAKRnVydGhlcm1vcmUsIGZhdGFsIHNob290aW5ncyBjYW4gaGF2ZSB2YXN0IGFuZCBsYXN0aW5nIGltcGFjdHMgYmVjYXVzZSBtYW55IHN0dWRlbnRzIGNhbiB3aXRuZXNzIGEgc2luZ2xlIGV2ZW50LgoKQW5vdGhlciByZWNlbnRseSBwdWJsaXNoZWQgW2FydGljbGVdKGh0dHBzOi8vc2llcHIuc3RhbmZvcmQuZWR1L3NpdGVzL2RlZmF1bHQvZmlsZXMvcHVibGljYXRpb25zLzE5LTAzNi5wZGYpIGluZGljYXRlcyB0aGF0OgoKPiBPdmVyICoqMjQwLDAwMCoqIEFtZXJpY2FuIHN0dWRlbnRzIGV4cGVyaWVuY2VkIGEgc2Nob29sIHNob290aW5nIGluIHRoZSBsYXN0IHR3byBkZWNhZGVzLgoKCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiZXhwb3NlZC5wbmciKSkKCmBgYAoKIyMjIyMgW1tzb3VyY2VdXShodHRwczovL3NpZXByLnN0YW5mb3JkLmVkdS9zaXRlcy9kZWZhdWx0L2ZpbGVzL3B1YmxpY2F0aW9ucy8xOS0wMzYucGRmKQogClRoaXMgc3R1ZHkgZm9sbG93ZWQgc3R1ZGVudHMgd2hvIGV4cGVyaWVuY2VkIGEgc2Nob29sIHNob290dGluZyB0aGUgVW5pdGVkIFN0YXRlcyBiZXR3ZWVuIDIwMDggYW5kIDIwMTMgYW5kIGFzc2Vzc2VkIHRoZWlyIG1lbnRhbCB3ZWxsLWJlaW5nLiBUaGV5IGZvdW5kIHRoYXQ6Cgo+IEZhdGFsIHNjaG9vbCBzaG9vdGluZ3MgaGF2ZSBsYXJnZSBhbmQgcGVyc2lzdGVudCBpbXBhY3RzIG9uIHRoZSBtZW50YWwgaGVhbHRoIG9mIGxvY2FsIHlvdXRoLiBJbiB0aGUgdHdvIHllYXJzIGZvbGxvd2luZyBhIGZhdGFsIHNjaG9vbCBzaG9vdGluZywgdGhlIG1vbnRobHkgbnVtYmVyIG9mIGFudGlkZXByZXNzYW50IHByZXNjcmlwdGlvbnMgd3JpdHRlbiB0byBpbmRpdmlkdWFscyB1bmRlciBhZ2UgMjAgaXMgMjEuMyBwZXJjZW50IGhpZ2hlciBpbiB0aGUgc2hvb3RpbmctZXhwb3NlZCByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlIGFyZWFzLiAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dHdpZHRoID0gIjQwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJmZXJuYW5kby1jZmVyZG8tNngyaUtHaTZTUFUtdW5zcGxhc2guanBnIikpCmBgYAoKPHNwYW4+UGhvdG8gYnkgPGEgaHJlZj0iaHR0cHM6Ly91bnNwbGFzaC5jb20vQGNmZXJkbz91dG1fc291cmNlPXVuc3BsYXNoJmFtcDt1dG1fbWVkaXVtPXJlZmVycmFsJmFtcDt1dG1fY29udGVudD1jcmVkaXRDb3B5VGV4dCI+RmVybmFuZG8gQGNmZXJkbzwvYT4gb24gPGEgaHJlZj0iaHR0cHM6Ly91bnNwbGFzaC5jb20vcy9waG90b3MvZGVwcmVzc2lvbj91dG1fc291cmNlPXVuc3BsYXNoJmFtcDt1dG1fbWVkaXVtPXJlZmVycmFsJmFtcDt1dG1fY29udGVudD1jcmVkaXRDb3B5VGV4dCI+VW5zcGxhc2g8L2E+PC9zcGFuPgoKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpSb3NzaW4tU2xhdGVyLCBNLiwgU2NobmVsbCwgTS4sIFNjaHdhbmR0LCBILiwgVHJlam8sIFMuICYgVW5pYXQsIEwuIExvY2FsIEV4cG9zdXJlIHRvIFNjaG9vbCBTaG9vdGluZ3MgYW5kIFlvdXRoIEFudGlkZXByZXNzYW50IFVzZS4gdzI2NTYzIGh0dHA6Ly93d3cubmJlci5vcmcvcGFwZXJzL3cyNjU2My5wZGYgKDIwMTkpIGRvaToxMC4zMzg2L3cyNjU2My4KCiMjIyMKIAojIyAqKkxpbWl0YXRpb25zKioKKioqIApUaGVyZSBhcmUgc29tZSBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbnMgcmVnYXJkaW5nIHRoaXMgZGF0YSBhbmFseXNpcyB0byBrZWVwIGluIG1pbmQ6IAoKMSkgVGhpcyBhbmFseXNpcyBpcyBleHBsb3JhdG9yeSBhbmQsIGFzIHN1Y2gsIGRvZXMgbm90IGludGVuZCB0byBwcm92aWRlIGluZmVyZW50aWFsIGNvbmxjdXNpb25zLiAgCgoyKSBUaGlzIGRhc2hib2FyZCBvbmx5IHVzZXMgb25lIHNvdXJjZSBvZiBkYXRhLiBUaGVyZSBtYXkgYmUgc2Nob29sIHNob290aW5nIGV2ZW50cyB0aGF0IGFyZSBub3QgbGlzdGVkIGluIHRoaXMgZGF0YSBvciBlcnJvcnMgaW4gdGhpcyBkYXRhLgoKQWNjb3JkaW5nIHRvIHRoZSBkYXRhYmFzZSB3ZWJzaXRlOgoKPiJUaGlzIGRhdGFiYXNlIHdhcyBkZXZlbG9wZWQgZnJvbSBvcGVuLXNvdXJjZSBpbmZvcm1hdGlvbiBhbmQgbWF5IGluY2x1ZGUgcmVwb3J0aW5nIGVycm9ycy4iCgpGdXJ0aGVybW9yZSwgYWNjb3JkaW5nIHRvIHRoaXMgW2FydGljbGVdKGh0dHBzOi8vbGluay5zcHJpbmdlci5jb20vYXJ0aWNsZS8xMC4xMDA3L3MxMTkyMC0wMTItMDMzMS02KSBzY2hvb2xzIGFyZSBub3QgcmVxdWlyZWQgdG8gcmVwb3J0IHNjaG9vbCBzaG9vdGluZ3MgdW5sZXNzIHRoZXkgcmVzdWx0ZWQgaW4gYSBzdWljaWRlIG9yIGhvbWljaWRlLCB0aGVyZWZvcmUgdGhlcmUgbWF5IGJlIG1vcmUgZXZlbnRzIHRoYXQgcmVzdWx0IGluIG9ubHkgaW5qdXJ5IG9yIG5vIGluanVyaWVzIG9yIGRlYXRoIHRoYXQgbWF5IG5vdCBiZSBpbmNsdWRlZC4KClRoZXJlIGFyZSBpbmRlZWQgZXZlbnRzIGluIHRoZSBkYXRhc2V0IHRoYXQgaW5jbHVkZSB6ZXJvIGRlYXRocyBhbmQgemVybyBpbmp1cmllcywgYnV0IGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgbWFueSBvZiB0aGVzZSBldmVudHMgYXJlIG5vdCBsaXN0ZWQuCgpBdm9jYWRvLi4uIHRoaXMgc291cmNlIGZyb20gMjAxMyBzYXlzIHRoYXQgc2Nob29scyBhcmUgbm90IHJlcXVpcmVkIHRvIHJlcG9ydC4uIGlzIHRoaXMgc3RpbGwgdHJ1ZT8KCgojIyAqKldoYXQgYXJlIHRoZSBkYXRhPyoqCioqKiAKCldlIHdpbGwgdXNlIGRhdGEgZnJvbSB0aGUgb3Blbi1zb3VyY2UgW0stMTIgU2hvb2wgU2hvb3RpbmcgRGF0YWJhc2VdKGh0dHBzOi8vd3d3LmNoZHMudXMvc3NkYi9kYXRhc2V0LykgZG93bmxvYWRlZCBmcm9tIHRoZSBbQ2VudGVyIGZvciBIb21lbGFuZCBEZWZlbnNlIGFuZCBTZWN1cml0eV0oaHR0cHM6Ly93d3cuY2hkcy51cy9jLykgYXQgdGhlIGF0IHRoZSBbTmF2YWwgUG9zdGdyYWR1YXRlIFNjaG9vbChOUFMpXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXZhbF9Qb3N0Z3JhZHVhdGVfU2Nob29sKSBpbiBNb250ZXJleSwgQ2FsaWZvcm5pYS4gVGhpcyBkYXRhIGlzIHVwZGF0ZWQgZGFpbHkuIFRoZSBkYXRhICB1c2VkIGluIHRoaXMgY2FzZSBzdHVkeSB3YXMgZG93bmxvYWRlZCBpbiBKdW5lIG9mIDIwMjAuIAoKIyMjIyB7LnJlZmVyZW5jZV9ibG9ja30KClJpZWRtYW4sIERhdmlkLCBhbmQgRGVzbW9uZCBP4oCZTmVpbGwuIOKAnENIRFMg4oCTIEstMTIgU2Nob29sIFNob290aW5nIERhdGFiYXNlLuKAnSBDZW50ZXIgZm9yIEhvbWVsYW5kIERlZmVuc2UgYW5kIFNlY3VyaXR5LCBKdW5lIDIwMjAsIFt3d3cuY2hkcy51cy9zc2RiXSh3d3cuY2hkcy51cy9zc2RiKS4KCiMjIyMKClRoaXMgZGF0YWJhc2UgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgc2Nob29sIHNob290aW5nIGV2ZW50cyBmb3Igc3R1ZGVudHMgaW4gZ3JhZGVzIEstMTIgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgZGF0aW5nIGJhY2sgdG8gMTk3MC4gVGhlIGRhdGFiYXNlIGhhcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5vdCBzaG93biBvbiBvdXIgZGFzaGJvYXJkIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG86IAoKCiogTG9jYXRpb24gb2YgdGhlIGV2ZW50IGF0IHRoZSBzY2hvb2wgIAoqIElmIHRoZSBldmVudCBvY2N1cmVkIGR1cmluZyBhIHNwb3J0aW5nIGV2ZW50ICAKKiBUaW1lIG9mIGRheSBvZiB0aGUgZXZlbnQgIAoqIERheSBvZiB0aGUgd2VlayBvZiB0aGUgZXZlbnQgIAoqIFNvdXJjZSBmb3IgdGhlIHNob290aW5nIGluZm9ybWF0aW9uICAKKiBJZiB0aGUgZXZlbnQgd2FzIHByZS1wbGFubmVkIG9yIG5vdCAgCiogU2hvb3RlcidzIGFjdGlvbnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBzaG9vdGluZyAgCiogU2hvb3RlciBjaGFyYWN0ZXJpc3RpY3MgKGFmZmlsaWF0aW9uIHdpdGggdGhlIHNjaG9vbCwgaWYgdGhleSBoYWQgYWNjb21wbGljZXMsIGlmIHRoZXkgdG9vayBob3N0YWdlcywgYW5kIHRoZWlyIGFnZSBhbmQgcmFjZSkgIAoqIFZpY3RvbSBjaGFyYWN0ZXJpc3RpY3MgKGFmZmljbGlhdGlvbiB3aXRoIHRoZSBzY2hvb2wsIGlmIHRoZXkgd2VyZSB0YXJnZXRlZCwgdGhlaXIgYWdlIGFuZCByYWNlKSAgCgpBY2NvcmRpbmcgdG8gdGhlIFtLLTEyIFNob29sIFNob290aW5nIERhdGFiYXNlXShodHRwczovL3d3dy5jaGRzLnVzL3NzZGIvZGF0YXNldC8pIHdlYnNpdGU6Cgo+IFRoZSBTY2hvb2wgU2hvb3RpbmcgRGF0YWJhc2UgUHJvamVjdCBpcyBjb25kdWN0ZWQgYXMgcGFydCBvZiB0aGUgW0FkdmFuY2VkIFRoaW5raW5nIGluIEhvbWVsYW5kIFNlY3VyaXR5IChIU3gpXShodHRwczovL3d3dy5jaGRzLnVzL2MvYWNhZGVtaWMtcHJvZ3JhbXMvaHN4LykgcHJvZ3JhbSBhdCB0aGUgTmF2YWwgUG9zdGdyYWR1YXRlIFNjaG9vbOKAmXMgW0NlbnRlciBmb3IgSG9tZWxhbmQgRGVmZW5zZSBhbmQgU2VjdXJpdHkgKENIRFMpXShDZW50ZXIgZm9yIEhvbWVsYW5kIERlZmVuc2UgYW5kIFNlY3VyaXR5IChDSERTKS4KCj4gVGhlIGRhdGFiYXNlIGNvbXBpbGVzIGluZm9ybWF0aW9uIGZyb20gbW9yZSB0aGFuIDI1IGRpZmZlcmVudCBzb3VyY2VzIGluY2x1ZGluZyBwZWVyLXJldmlld2VkIHN0dWRpZXMsIGdvdmVybm1lbnQgcmVwb3J0cywgbWFpbnN0cmVhbSBtZWRpYSwgbm9uLXByb2ZpdHMsIHByaXZhdGUgd2Vic2l0ZXMsIGJsb2dzLCBhbmQgY3Jvd2Qtc291cmNlZCBsaXN0cyB0aGF0IGhhdmUgYmVlbiBhbmFseXplZCwgZmlsdGVyZWQsIGRlY29uZmxpY3RlZCwgYW5kIGNyb3NzLXJlZmVyZW5jZWQuIEFsbCBvZiB0aGUgaW5mb3JtYXRpb24gaXMgYmFzZWQgb24gb3Blbi1zb3VyY2UgaW5mb3JtYXRpb24gYW5kIDNyZCBwYXJ0eSByZXBvcnRpbmcuCgojIyAqKkRhdGEgSW1wb3J0KioKKioqIAoKVG8gaW1wb3J0IHRoZSByYXcgZGF0YSBmaWxlIHdlIHdpbGwgdXNlIHRoZSBgcmVhZF9jc3YoKWAgZnVuY3Rpb24gb2YgdGhlIGByZWFkcmAgcGFja2FnZS4gCgpXZSB3aWxsIHVzZSB0aGUgYGhlcmUoKWAgZnVuY3Rpb24gb2YgdGhlIGBoZXJlYCBwYWNrYWdlIHRvIGVhc2lseSBsb2NhdGUgdGhlIGRhdGEgd2l0aGluIHRoZSBgcmF3X2RhdGFgIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSAuUnByb2ogZmlsZS4KCldlIHdhbnQgdG8gc2tpcCB0aGUgZmlyc3Qgcm93IHRoYXQgc3RhdGVzOgpVcGRhdGVkIDYvMi8yMDIwIC0gVmlldyBncmFwaHMgYW5kIHJlc2VhcmNoIG1ldGhvZG9sb2d5IG9uIHd3dy5jaGRzLnVzL3NzZGIgSWYgeW91IGhhdmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgaW5jaWRlbnRzLCBwbGVhc2UgZW1haWwgSzEyc3NkYkBjaGRzLnVzLiIKClRvIGRvIHRoaXMsIHdlIGNhbiB1c2UgdGhlIGBza2lwYCBhcmd1bWVudCBvZiB0aGlzIGZ1bmN0aW9uIGFuZCBzcGVjaWZ5IHRoYXQgd2Ugd2lzaCB0byBvbmx5IHNraXAgMSByb3cgd2l0aCBgc2tpcCA9IDFgLiBXZSBjYW4gYWxzbyBzcGVjaWZ5IHRoYXQgdGhlIG5leHQgcm93IHNob3VsZCBiZSB1c2VkIGZvciBjb2x1bW4gbmFtZXMgdXNpbmcgdGhlIGBjb2xfbmFtZXMgPSBUUlVFYCBhcmd1bWVudC4gCgoKYGBge3J9CgpzaG9vdGluZ19kYXRhIDwtIHJlYWRyOjpyZWFkX2NzdihmaWxlID0gaGVyZTo6aGVyZSgicmF3X2RhdGEiLCAiSy0xMl9TU0RCXyhQdWJsaWMpLUstMTJfU1NEQl8oUHVibGljKV9MaW5rZWQuY3N2IiksIGNvbF9uYW1lcyA9IFRSVUUsIHNraXAgPSAxKQpgYGAKCgpXZSBjYW4gdXNlIHRoZSBgZ2xpbXBzZWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZSB0byB0YWtlIGEgbG9vayBhdCBjb2x1bW5zIHdpdGhpbiB0aGUgZGF0YWJhc2U6CgojIyMjIHsuc2Nyb2xsYWJsZSB9CmBgYHtyfQojIFNjcm9sbCB0aHJvdWdoIHRoZSBvdXRwdXQhCmdsaW1wc2Uoc2hvb3RpbmdfZGF0YSkKYGBgCgojIyMjCgpXZSBjYW4gYWxzbyB1c2UgdGhlIHV0aWxzIGBzdHIoKWAgZnVuY3Rpb24gdG8gc2VlIG1vcmUgZGV0aWFscyBhYm91dCB0aGUgdmFsdWVzLiBUeXBpY2FsbHkgd2Ugd291bGQgYmUgYWJsZSB0byBzZWUgdGhlc2Ugd2l0aCBgZ2xpbXBzZSgpYCBidXQgc29tZSBvZiB0aGUgY29sdW1ucyBoYXZlIHZlcnkgbG9uZyBuYW1lcywgdGh1cyBvYnNjdXJpbmcgdGhlIGZpcnN0IGZldyB2YWx1ZXMgaW4gdGhlIG91dHB1dC4KCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CiMgU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCEKc3RyKHNob290aW5nX2RhdGEpCmBgYAoKIyMjIwoKIyMgKipEYXRhIEV4cGxvcmF0aW9uIGFuZCBXcmFuZ2xpbmcqKgoqKioKTHVja2lseSwgb3VyIGRhdGEgaXMgYWxyZWFkeSBpbiBwcmV0dHkgZ29vZCBzaGFwZSwgYnV0IHdlIHdhbnQgdG8gbWFrZSBvdXIgZGF0YSBtb3JlIHVzZWZ1bCBmb3Igb3VyIGRhc2hib2FyZC4gCgojIyMgQWRkaW5nIHN0YXRlIG5hbWUKCkl0IHdvdWxkIGJlIHVzZWZ1bCB0byBoYXZlIHRoZSBmdWxsIHN0YXRlIG5hbWUgaW4gb3VyIGRhdGEsIHJhdGhlciB0aGFuIGp1c3QgdGhlIGFiYnJldmlhdGlvbi4KCldlIGNhbiBkbyBzbyBieSB1c2luZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIFVTIDUwIHN0YXRlcyBpbiBhIGRhdGFzZXQgY2FsbGVkIGBzdGF0ZWAgdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGxvYWRlZCB3aXRoIFIgc2Vzc2lvbnMgaW4gdGhlIGBkYXRhc2V0c2AgcGFja2FnZS4gVGhlIGBzdGF0ZS5hYmJgIG9iamVjdCBpcyBhIGxpc3Qgb2YgdGhlIHN0YXRlIGFiYnJldmlhdGlvbnMgYW5kIGBzdGF0ZS5uYW1lYCBpcyBhIGxpc3Qgb2YgdGhlIHN0YXRlIG5hbWVzLgoKYGBge3J9CnN0YXRlLmFiYgpzdGF0ZS5uYW1lCmBgYAoKV2Ugd2lsbCBjb21iaW5lIHRoZXNlIHVzaW5nIHRoZSBgdGliYmxlKClgIGZ1bmN0aW9uIG9mIHRoZSBgdGliYmxlKClgIHBhY2thZ2UuIAoKYGBge3J9CnN0YXRlX2RmIDwtIHRpYmJsZShTdGF0ZV9hYmIgPSBzdGF0ZS5hYmIsIFN0YXRlID0gc3RhdGUubmFtZSkKCnNsaWNlX2hlYWQoc3RhdGVfZGYsIG49IDQpCmBgYAoKTm93IHdlIHdpbGwgY29tYmluZSB0aGlzIHdpdGggb3VyIGRhdGEgdXNpbmcgdGhlIGBsZWZ0X2pvaW4oKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZS4gYXZvY2FkbyBhZGQgZXhwbGFuYXRpb24gYW5kIGpvaW4gaW1hZ2VzCmh0dHBzOi8vZHBseXIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2Uvam9pbi5odG1sCgoKYGBge3J9CnNob290aW5nX2RhdGEgJTw+JQogIHJlbmFtZSgiU3RhdGVfYWJiIiA9IFN0YXRlKSAlPiUKICBsZWZ0X2pvaW4oc3RhdGVfZGYsIGJ5ID0gYygiU3RhdGVfYWJiIiA9ICJTdGF0ZV9hYmIiKSkKYGBgCgpgYGB7cn0Kc2hvb3RpbmdfZGF0YSAlPiUKICBzZWxlY3QoU2Nob29sLCBDaXR5LCBTdGF0ZV9hYmIsIFN0YXRlKSAlPiUKICBzbGljZV9oZWFkKG4gPSA0KQpgYGAKCiMjIyBSZWZvcm1hdGluZyBkYXRlcwpXZSBhbHNvIHdhbnQgdG8gcmVmb3JtYXQgb3VyIGRhdGUgdmFsdWVzIGFuZCBjcmVhdGUgYSBgRGF0ZV95ZWFyYCB2YXJpYWJsZSBiYXNlZCBvbiB0aGUgeWVhciBpbiBlYWNoIGRhdGUuIFdlIGNhbiB1c2UgdGhlIGBsdWJyaWRhdGVgIHBhY2thZ2UgZm9yIHRoaXMuCgpUaGUgYG1keSgpYCBmdW5jdGlvbiBjb252ZXJ0cyBkYXRlcyBpbnRvIGEgZm9ybWF0IHdoZXJlIGRhdGVzIGFyZSBsaXN0ZWQgYXMgbW9udGgsIGRhdGUsIGFuZCB5ZWFyIHdpdGggaHlwaGVucyBpbiBiZXR3ZWVuLgpUaGUgYHllYXIoKWAgZnVuY3Rpb24gY2FuIHRoZW4gYmUgdXNlZCB0byBleHRyYWN0IGp1c3QgdGhlIHllYXIgZnJvbSBlYWNoIGRhdGUuCgpgYGB7cn0Kc2hvb3RpbmdfZGF0YSAlPD4lCiAgICAgICBtdXRhdGUoRGF0ZSA9IGx1YnJpZGF0ZTo6bWR5KERhdGUpKSAlPiUKICBtdXRhdGUoRGF0ZV95ZWFyID0gbHVicmlkYXRlOjp5ZWFyKERhdGUpKQoKc2hvb3RpbmdfZGF0YSAlPiUgc2VsZWN0KERhdGUsIERhdGVfeWVhcikKYGBgCkxvb2tzIGdvb2QhCgpPbmUgbGFzdCB0aGluZyB0byBkbyBpcyB0byBjb252ZXJ0IGBZZXNgIGFuZCBgTm9gIHZhbHVlcyBpbnRvIGBUUlVFYCBhbmQgYEZBTFNFYC4KCgpGaXJzdCBsZXQncyB0YWtlIGEgbG9vayBhdCBvdXIgZGF0YToKCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CnN0cihzaG9vdGluZ19kYXRhKQoKYGBgCgojIyMjCgpXZSBzZWUgdGhhdCBtYW55IG9mIHRoZSB2YXJhaWJsZXMgaGF2ZSBlaXRoZXIgYFllc2Agb3IgYE5vYCB2YWx1ZXMgb3IgYFlgIGFuZCBgTmAgdmFsdWVzLiAgVGhlc2UgYXJlIHRoZSB2YXJpYWJsZXMgdGhhdCBoYXZlIGBZL05gIGluIHRoZSBuYW1lIG9yIHRoZSBgVGFyZ2V0ZWQgU3BlY2lmaWMgVmljdGltKHMpYCwgYFJhbmRvbSBWaWN0aW1zYCwgYFByZS1wbGFubmVkIHNjaG9vbCBhdHRhY2tgIHZhcmlhYmxlcy4gV2UgY2FuIG1ha2UgdGhlc2UgY29uc2lzdGVudGx5IGBUUlVFYCBhbmQgYEZBTFNFYCBieSB1c2luZyB0aGUgYGNhc2Vfd2hlbigpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB1cyB0byBzcGVjaWZ5IG5ldyB2YWx1ZXMgZm9yIGV4aXN0aW5nIHZhbHVlcywgc2ltbGFybHkgdG8gdGhlIGByZWNvZGUoKWAgZnVuY3Rpb24gYWxzbyBvZiBgZHBseXJgLiBUaGUgYmVuZWZpdCBvZiB0aGUgYGNhc2Vfd2hlbigpYCBmdW5jdGlvbiwgaXMgdGhhdCBjaGFuZ2luZyB0aGUgdmFsdWVzIHRvIGBUUlVFYCBvciBgRkFMU0VgIGFsc28gcmVzdWx0cyBpbiB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgdmFyaWFibGUgY2hhbmdpbmcgdG8gdHlwZSBsb2dpY2FsICh3aGljaCBpcyBpbnRlcnByZXRlZCBhcyBhIGJpbmFyeSB2YXJpYWJsZSB3aXRoIGBUUlVFYCBhbmQgYEZBTFNFYCB2YWx1ZXMpIG90aGVyd2lzZSwgd2l0aCBgcmVjb2RlKClgIHRoZSB2YXJpYWJsZXMgd291bGQgcmVtYWluIGFzIGNsYXNzIHR5cGUgY2hhcmFjdGVyLiAKCjxkZXRhaWxzPjxzdW1tYXJ5PiBjbGljayBoZXJlIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYHJlY29kZSgpYCBhbmQgY2FzZV93aGVuKClgPC9zdW1tYXJ5PgoKYXZvY2FkbyBjaGVjayBvbiB0aGVzZSBzdGF0ZW1lbnRzICAtIHRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSB0cnVlIGZvciBjYXNlX3doZW4gZGVzcGl0ZSB3aGF0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMgIklmIG5vIGNhc2VzIG1hdGNoLCBOQSBpcyByZXR1cm5lZC4iCgpOb3RlLCB0aGF0IHdpdGggYHJlY29kZSgpYCB0aGVyZSBpcyB0aGUgb3B0aW9uIHRoYXQgb3RoZXIgdmFsdWVzIGJlIHJlY29kZWQgdG8gYE5BYCBhbHRob3VnaHQgdGhpcyBpcyBub3QgdGhlIGRlZmF1bHQsIGhvd2V2ZXIgd2l0aCBgY2FzZV93aGVuKClgIG90aGVyIHZhbHVlcyBub3QgZXhwbGljaXRseSBhc3NpZ25lZCBpbiB0aGUgY2FzZV93aGVuKCkgc3RhdGVtZW50IHdpbGwgYmUgYE5BYC4gRnVydGhlciBtb3JlIG9ubHkgdmFsdWVzIGNhbiBiZSB1c2VkIG9uIHRoZSBsZWZ0IHNpZGUgd2hlbiB1c2luZyBgcmVjb2RlKClgIHdoZXJlYXMgYGNhc2Vfd2hlbigpYCBhY2NlcHRzIGV4cHJlc3Npb25zIHRoYXQgbmVlZCB0byBiZSBldmFsdWF0ZWQsIHVubGVzcyB1c2luZyB0aGUgYDo9YCBvcHBlcmF0b3IuPz8/CgoKKioqCgo8L2RldGFpbHM+Cgphdm9jYWRvIGFkZCBsaW5rcyBhYm91dCB0aGlzLyBtYXliZSBhZGQgL2NoZWNrIGlmIHdlIGFscmVhZHkgYWRkZWQgdGhlIGNsYXNzIHR5cGUgc3R1ZmYgZnJvbSB0aGUgb3RoZXIgY2FzZSBzdHVkaWVzIC0gaW5kZWVkIGNhc2V3aGVuIGluIG90aGVyIGNhc2VzIHNlZW1zIHRvIGF1dG9tYXRpY2FsbHkgbWFrZSBhbGwgb3RoZXIgY2FzZXMgTkEgYnV0IHdhcyB0aGF0IHRoZSBjYXNlIGhlcmU/CgpUbyBpbXBsZW1lbnQgdGhlIGBjYXNlX3doZW4oKWAgcmVjb2Rpbmcgb2YgdmFsdWVzLCB0aGUgZXhpc2l0aW5nIHZhbHVlcyBhcmUgd3JpdHRlbiBvbiB0aGUgbGVmdCBvZiB0aGUgYH5gIHNpZ24gKHF1b3RhdGlvbiBtYXJrcyBuZWNlc3NhcnkpIGFuZCBuZXcgdmFsdWVzIGFyZSB3cml0dGVuIG9uIHRoZSByaWdodCAocXVvdGF0aW9ucyBtYXJrcyBhcmUgbm90IG5lY2Vzc2FyeSBhcyB0aGVzZSBhcmUgYFRSVUVgIGFuZCBgRkFMU0VgIHN0YXRtZW50cykuIFdlIHdpbGwgYWxzbyB1c2UgdGhlIGBhY3Jvc3MoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZSBhbmQgdGhlIGBtYXRjaGVzKClgIGZ1bmN0aW9uIG9mIHRoZSBgdGlkeXNlbGVjdGAgcGFja2dlIHRvIGFsbG93IHVzIHRvIGFwcGx5IHRoaXMgdG8gYWxsIG9mIHRoZSB2YXJpYWJsZXMgdGhhdCBoYXZlIGEgcGF0dGVybiB0aGF0IHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhvc2Ugb2YgdGhlIHZhcmlhYmxlcyB3ZSB3YW50IHRvIGNoYW5nZS4gVGhlIGB8YCBzeW1ib2wgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gb3IsIHRodXMgYW55IHZhcmlhYmxlcyB0aGF0IGhhcyBhIG5hbWUgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGVzZSBwYXR0ZXJucyB3aWxsIGJlIGNoYW5nZWQuIGZUaGUgYGFjcm9zcygpYCBmdW5jdGlvbiB0aGVuIGFwcGxpZXMgdGhlIGBjYXNlX3doZW4oKWAgZnVuY3Rpb24gdG8gYWxsIG9mIHRoZXNlIHZhcmlhYmxlcy4gTm90aWNlIHRoYXQgdGhlIGB+YCBzeW1ib2wgaXMgbmVjZXNzYXJ5IGJlZm9yZSB0aGUgZnVudGlvbiB0aGF0IGlzIGFwcGxpZWQgdXNpbmcgYGFjcm9zcygpYC4KYGBge3J9CgpEVDo6ZGF0YXRhYmxlKHNob290aW5nX2RhdGEpCmBgYAoKCmBgYHtyfQoKc2hvb3RpbmdfZGF0YSU+JSBzZWxlY3QobWF0Y2hlcygiWS9OfFNwZWNpZmljfFJhbmRvbXxQcmUtcGxhbm5lZCIpKQoKc2hvb3RpbmdfZGF0YSAlPD4lCiAgICAgICBtdXRhdGUoZHBseXI6OmFjcm9zcyguY29scyA9IG1hdGNoZXMoIlkvTnxTcGVjaWZpY3xSYW5kb218UHJlLXBsYW5uZWQiKSwKICAgICAgICAgICAgICAgICAgICB+IGRwbHlyOjpjYXNlX3doZW4oLiA9PSAiWWVzIiB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj09ICJObyIgfiBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj09ICJZIiB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49PSAiTiIgfiBUUlVFKSkpCgpzaG9vdGluZ19kYXRhICU+JSBzZWxlY3QobWF0Y2hlcygiWS9OfFNwZWNpZmljfFJhbmRvbXxQcmUtcGxhbm5lZCIpKQoKYGBgCgoKCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CnN0cihzaG9vdGluZ19kYXRhKQoKYGBgCgojIyMjCgpMb29rcyBnb29kIQoKCgpmcm9tIE1pY2hhZWw6CmBgYHtyLCBldmFsID0gRkFMU0V9CnNob290aW5nX2RhdGFfZ2VvY29kZWQgPC0gcmVhZF9jc3YoaGVyZSgicHJvY2Vzc2VkX2RhdGEiLAogICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhLmNzdiIpKQpzaG9vdGluZ19kYXRhX2dlb2NvZGVkIDwtIHNob290aW5nX2RhdGFfZ2VvY29kZWQgJT4lCiAgZmlsdGVyKCFpcy5uYShsb25naXR1ZGUpLAogICAgICAgICAhaXMubmEobGF0aXR1ZGUpKSAlPiUKICBzZjo6c3RfYXNfc2YoY29vcmRzID0gYygibG9uZ2l0dWRlIiwgImxhdGl0dWRlIiksIGNycyA9IDQzMjYpICU+JQogIAogIHN0X3RyYW5zZm9ybShjcnMgPSAxMDIwMDgpICU+JQogIHN0X2ppdHRlcihhbW91bnQgPSA1MCkgJT4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDQzMjYpICU+JQogIG11dGF0ZShsb25naXR1ZGUgPSBzdF9jb29yZGluYXRlcyguKVssMV0sCiAgICAgICAgIGxhdGl0dWRlID0gc3RfY29vcmRpbmF0ZXMoLilbLDJdKSAlPiUKICBhc190aWJibGUoKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1nZW9tZXRyeSkKCnN0YXRlX2RmIDwtIGFzX3RpYmJsZShjYmluZChzdGF0ZS5hYmIsIHN0YXRlLm5hbWUpKQoKc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCA8LSBzaG9vdGluZ19kYXRhX2dlb2NvZGVkICU+JQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJW0vJWQvJVkiKSkgJT4lCiAgbXV0YXRlKERhdGVfeWVhciA9IHllYXIoRGF0ZSkpICU+JQogIHJlbmFtZSgiU3RhdGVfYWJiIiA9IFN0YXRlKSAlPiUKICBsZWZ0X2pvaW4oc3RhdGVfZGYsIGJ5ID0gYygiU3RhdGVfYWJiIiA9ICJzdGF0ZS5hYmIiKSkgJT4lCiAgcmVuYW1lKCJTdGF0ZSIgPSBzdGF0ZS5uYW1lKSAlPiUKICBtdXRhdGUoU3RhdGUgPSBzdHJfdG9fdGl0bGUodG9sb3dlcihTdGF0ZSkpKSAlPiUKICBtdXRhdGUoYFN1aWNpZGUgKG9yIGF0dGVtcHRlZCBzdWljaWRlKSBieSBTaG9vdGVyIChZL04pYCA9IGNhc2Vfd2hlbihgU3VpY2lkZSAob3IgYXR0ZW1wdGVkIHN1aWNpZGUpIGJ5IFNob290ZXIgKFkvTilgID09ICJZZXMiIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gRkFMU0UpKQoKc3RhcnQgPC0gMTk3MAplbmQgPC0gMjAyMAoKd3JpdGVfY3N2KHNob290aW5nX2RhdGFfZ2VvY29kZWQsIHBhdGggPSBoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvb3RpbmdfZGF0YV93cmFuZ2xlZC5jc3YiKSkKCnJtKHNob290aW5nX2RhdGFfZ2VvY29kZWQpCgpzaG9vdGluZ19kYXRhX2dlb2NvZGVkIDwtIHJlYWRfY3N2KGhlcmUoInByb2Nlc3NlZF9kYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhX3dyYW5nbGVkLmNzdiIpKQpgYGAKCgoKCldlIGFyZSBhbHNvIGludGVyZXN0ZWQgaW4gY3JlYXRpbmcgYSBtYXAgb24gb3VyIGRhc2hib2FyZC4gCgpUbyBkbyBzbyB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBwcm9jZXNzIGNhbGxlZCBbZ2VvY29kaW5nXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HZW9jb2RpbmcpLiBHZW9jb2RpbmcgaXMgdGhlIHByb2Nlc3Mgb2YgY29udmVydGluZyBhZGRyZXNzZXMgaW50byBsYXRpdHVkZSBhbmQgbG9uZ3RpdHVkZSBjb29yZGluYXRlcy4KCiMjIyBHZW9jb2Rpbmcgd2l0aCB0aGUgYGdnbWFwYCBwYWNrYWdlCgpUbyBwZWZvcm0gdGhlIGdlb2NvZGluZyB3ZSBuZWVkIHRoZSBhZGRyZXNzIG9mIGVhY2ggc2Nob29sIGluIHRoZSBkYXRhIHNldC4gVGhlIGRhdGEgY3VycmVudGx5IGRvZXMgbm90IGxpc3QgdGhlIGFjdHVhbCBhZGRyZXNzLCBidXQgZG9lcyBoYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzY2hvb2wgd2hlcmUgdGhlIGV2ZW50IG9jY3VyZWQuIFNpbmNlIHNvbWUgc2Nob29scyBoYXZlIHRoZSBzYW1lIG5hbWUsIHdlIG5lZWQgdGhlIGNpdHkgYW5kIHN0YXRlIGRhdGEgYXMgd2VsbC4gU28gd2Ugd2lsbCBjcmVhdGUgYSBuZXcgdmFyaWFibGUgaW4gb3VyIGRhdGEgY2FsbGVkIGBhZGRyZXNzYCB1c2luZyB0aGUgYG11dGF0ZSgpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlLiBUaGlzIHZhcmlhYmxlIHdpbGwgY29sbGFwc2UgdGhlIHZhbHVlcyBpbiB0aGUgYFNjaG9vbGAsIGBDaXR5YCwgYW5kIGBTdGF0ZWAgY29sdW1ucyBidXQgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi4gSXQgaXMgc3BlY2lmaWVkIHRoYXQgdGhlcmUgd2lsbCBiZSBzcGFjZSBpbiBiZXR3ZWVuIGJ5IHRoZSBgc2VwID0gIiAiYCBhcmd1bWVudC4gTm90ZSB0aGF0IGEgc3BhY2UgaXMgdHlwZWQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIG1hcmtzLiBUaGVuIHdlIGNhbiB1c2UgdGhlIGFkZHJlc3MgdmFyaWFibGUgdG8gbG9vayB1cCB0aGUgbGF0aXR1ZGUgYW5kIGxvbmd0aXR1ZGUgZm9yIGVhY2ggc2Nob29sLgoKCmBgYHtyfQpzaG9vdGluZ19kYXRhICU8PiUKICBkcGx5cjo6bXV0YXRlKGFkZHJlc3MgPSAKICAgICAgICAgIHN0cmluZ3I6OnN0cl9jKFNjaG9vbCwgQ2l0eSwgU3RhdGVfYWJiLCBzZXAgPSAiICIpKQoKYGBgCgpOb3RpY2UgdGhhdCB3ZSB1c2VkIGEgYCU+JWAgaW4gdGhlIHByZXZpb3VzIGNodW5rIG9mIGNvZGUuIFRoaXMgYWxsb3dzIHVzIHRvIGNyZWF0ZSBjb2RlIHdpdGggYSBtZXRob2QgY2FsbGVkIHBpcGluZy4gCgpJdCBhbGxvd3MgdXMgdG8gcGVyZm9ybSBtYW55IHNlcXVlbnRpYWwgc3RlcHMgZWZmaWNpZW50bHkuCgoqKioKPGRldGFpbHM+IDxzdW1tYXJ5PkNsaWNrIGhlcmUgaWYgeW91IGFyZSB1bmZhbWlsaWFyIHdpdGggcGlwaW5nIGluIFIsIHdoaWNoIHVzZXMgdGhpcyBgJT4lYCBvcGVyYXRvci48L3N1bW1hcnk+ICAKCkJ5IFtwaXBpbmddKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9tYWdyaXR0ci92aWduZXR0ZXMvbWFncml0dHIuaHRtbCkgd2UgbWVhbiB1c2luZyB0aGUgYCU+JWAgcGlwZSBvcGVyYXRvciB3aGljaCBpcyBhY2Nlc3NpYmxlIGFmdGVyIGxvYWRpbmcgdGhlIGB0aWR5dmVyc2VgIG9yIHNldmVyYWwgb2YgdGhlIHBhY2thZ2VzIHdpdGhpbiB0aGUgdGlkeXZlcnNlIGxpa2UgYGRwbHlyYCBiZWNhdXNlIHRoZXkgbG9hZCB0aGUgW2BtYWdyaXR0cmAgcGFja2FnZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21hZ3JpdHRyL3ZpZ25ldHRlcy9tYWdyaXR0ci5odG1sKS4gClRoaXMgYWxsb3dzIHVzIHRvIHBlcmZvcm0gbXVsdGlwbGUgc2VxdWVudGlhbCBzdGVwcyBvbiBvbmUgZGF0YSBpbnB1dC4KVGhlIG9iamVjdCBvbiB0aGUgbGVmdCBzaWRlIGlzIHVzZWQgYXMgaW5wdXQgdG8gYW55IGNvbW1hbmRzIHRvIHRoZSByaWdodCBvciBiZWxvdy4KCjwvZGV0YWlscz4gIAoqKioKCldlIGNhbiB0YWtlIGEgbG9vayBhdCBqdXN0IHRoaXMgbmV3IGBhZGRyZXNzYCB2YXJpYWJsZSB1c2luZyB0aGUgYHB1bGwoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cigpYCBwYWNrYWdlLgoKIyMjIyB7LnNjcm9sbGFibGUgfQpgYGB7cn0Kc2hvb3RpbmdfZGF0YSAlPiUKICBkcGx5cjo6cHVsbChhZGRyZXNzKQpgYGAKIyMjIyAKCk5vdyB3ZSBjYW4gdXNlIHRoZXNlIGFkZHJlc3NlcyB0byBmaW5kIHRoZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGZvciBlYWNoIHNjaG9vbCB3aGVyZSBhIHNjaG9vbCBzaG9vdGluZyBvY2N1cmVkLiBUbyBkbyB0aGlzIHdlIHdpbGwgdXNlIHRoZSBgZ2VvY29kZWAgZnVuY3Rpb24gb2YgdGhlIGBnZ21hcGAgcGFja2FnZSB0byBsb29rIHVwIHRoZXNlIGFkZHJlc3NlcyBvbiBHb29nbGUgTWFwcyB0byBnZXQgdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzLiBJbiB0aGlzIGNvbW1hbmQgd2UgbmVlZCB0byBzcGVjaWZ5IHRoYXQgd2Ugd2FudCB0byB1c2UgZ29vZ2xlIGFzIHRoZSBzb3VyY2UgdXNpbmcgdGhlIGBzb3VyY2VgIGFyZ3VtZW50IGFuZCB0aGF0IHdlIHdhbnQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSB1c2luZyB0aGUgYG91dHB1dCA9IGMoImxhdGxvbiIpIGFyZ3VtZW50LgoKClRoaXMgc3RlcCByZXF1aXJlcyByZWdpc3RlcmluZyB3aXRoIHRoZSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0gdG8gZ2V0IGFuIEFQSSBrZXksIHdoaWNoIGN1cnJlbnRseSByZXF1aXJlcyByZWdpc3RlcmluZyB5b3VyIHBheW1lbnQgaW5mb3JtYXRpb24gYW5kIGFncmVlaW5nIHRvIHRoZSBbR29vZ2xlIE1hcHMgQVBJIFRlcm1zIG9mIFNlcnZpY2VdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvdGVybXMpLgoKVGhlcmVmb3JlLCB3ZSB3aWxsIHNpbXBseSBkZW1vbnN0cmF0ZSBob3cgdGhpcyBwcm9jZXNzIHdvcmtzIGluIGdlbmVyYWwsIGJ1dCB5b3UgYXJlIG5vdCByZXF1aXJlZCB0byBkbyB0aGlzIHlvdXJzZWxmLiAKCjxkZXRhaWxzPjxzdW1tYXJ5PiBDbGljayBoZXJlIHRvIHNlZSBob3cgd2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0uPC9zdW1tYXJ5PgoKSWYgeW91IHdlcmUgdG8gZG8gdGhpcyBwcm9jZXNzIHlvdXJzZWxmLCB5b3UgY291bGQgZ2V0IGFuIEFQSSBrZXkgW2hlcmVdKGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9tYXBzLXBsYXRmb3JtLykuIEFnYWluIHRoaXMgcmVxdWlyZXMgcmVnaXN0ZXJpbmcgeW91ciBwYXltZW50IGluZm9ybWF0aW9uLCBidXQgaXQgaXMgZnJlZSB0byBnb3QgYW4gQVBJIGtleSBhbmQgZW5hYmxlIHRoZSBBUElzLCBob3dldmVyIHlvdSBjYW4gYmUgYmlsbGVkIGJhc2VkIG9uIGhvdyBtYW55IGFkZHJlc3NlcyB5b3UgbG9vayB1cCB1c2luZyB0aGUgQVBJcy4gWW91IG5lZWQgdG8gbG9vayB1cCB0aG91c2FuZHMgYmVmb3JlIGdldHRpbmcgYmlsbGVkLgoKVGhlbiB5b3UgbmVlZCB0byBlbmFibGUgdGhlIG1hcHMgYW5kIHBsYWNlcyBBUElzLCBieSBjbGlja2luZyBvbiB0aGUgYm94ZXMgbmV4dCB0byBlYWNoOgoKYGBge3IsZWNobyA9IEZBTFNFfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiZW5hYmxlLnBuZyIpKQpgYGAKClRoZW4geW91IHdvdWxkIHJlZ2lzdGVyIGxpa2Ugc28gYWZ0ZXIgY29weWluZyB0aGUgQVBJIGtleTogKE5vdGUgdGhpcyBpcyBhIGZha2Uga2V5KQoKYGBge3IsIGV2YWwgPSBGQUxTRX0KZ2dtYXA6OnJlZ2lzdGVyX2dvb2dsZShrZXkgPSAibVFrelRwaWFMWWpQcVhRQm90ZXNnaWYzRWZHTDJkYnJOVk9yb2dnIikgCmBgYAoKKioqCjwvZGV0YWlscz4KCgpPbmNlIHdlIGhhdmUgb2J0YWluZWQgYW4gQVBJIGtleSBhbmQgcmVnaXN0ZXJlZCwgd2UgY2FuIGdlb2NvZGUgb3VyIGRhdGEuCgpOb3RlIHRoYXQgdGhpcyBzdGVwIGlzIHRpbWUgaW50ZW5zaXZlLCBhcyB0aGVyZSBhcmUgbWFueSBhZGRyZXNzZXMgdG8gbG9vayB1cCEgVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3Qgc2hvdyBob3cgdGhpcyBpcyBkb25lLgoKYGBge3IsIGV2YWw9RkFMU0V9CgpzaG9vdGluZ19kYXRhIDwtIHNob290aW5nX2RhdGEgJT4lCiAgbXV0YXRlKGNvb3JkcyA9IGdnbWFwOjpnZW9jb2RlKGFkZHJlc3MsIG91dHB1dCA9IGMoImxhdGxvbiIpLCBzb3VyY2UgPSBjKCJnb29nbGUiKSkpCgpyZWFkcjo6d3JpdGVfY3N2KHNob290aW5nX2RhdGEsIHBhdGggPSBoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhX2dlby5jc3YiKSkKCmBgYAoKVGhpcyByZXN1bHRzIGluIHRpYmJsZSBjYWxsZWQgYGNvb3Jkc2AgYmVpbmcgYWRkZWQgdG8gb3VyIGBzaG9vdGluZ19kYXRhYCB0aWJibGUuIFRoYXQncyByaWdodCB3ZSBjYW4gaGF2ZSBhIHRpYmJsZSBhcyBhIGNvbHVtbiBvciB2YXJpYWJsZSB3aXRoaW4gYSB0aWJibGUuICAgVXNpbmcgdGhlIGBnbGltcHNlYCBmdW5jdGlvbiBhZ2FpbiwgYW5kIGxvb2tpbmcgYXQgdGhlIGxhc3QgZmV3IHZhcmlhYmxlcywgd2UgY2FuIHNlZSB0aGF0IG5vdyB0aGUgbGFzdCB2YXJpYWJsZSBsaXN0ZWQgaXMgYGNvb3Jkc2Agb2YgY2xhc3MgYDx0aWJibGU+YC4KCmBgYHtyLGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI4MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAic2hvb3RpbmdfZGF0YV9jb29yZHMucG5nIikpCmBgYAoKSWYgd2UgdGFrZSBhIGxvb2sgYXQgdGhlIGZpcnN0IGNvdXBsZSBvZiB2YWx1ZXMgb2YgdGhlIGBjb29yZHNgIHRpYmJsZSwgdXNpbmcgdGhlIGBzbGljZV9oZWFkKClgIGZ1bmN0aW9uIG9mIHRoZSBkcGx5ciBwYWNrYWdlLCB3ZSBzZWUgYSB0aWJibGUgdGhhdCBsb29rcyBsaWtlIHRoaXM6CgoKYGBge3IsZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjMwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJjb29yZHMucG5nIikpCmBgYAoKCkl0IHdvdWxkIGJlIGJldHRlciBpZiBlYWNoIG9mIHRoZXNlIHdlcmUgdGhlaXIgb3duIGNvbHVtbnMgaW4gdGhlIHRpYmJsZSwgc28gd2Ugd2lsbCBjcmVhdGUgbmV3IGBsb25naXR1ZGVgIGFuZCBgbGF0aXR1ZGVgIHZhcmlhYmxlcyBhZ2FpbiB1c2luZyB0aGUgYG11dGF0ZWAgZnVuY3Rpb24gbGlrZSBzbzoKCmBgYHtyLCBldmFsID0gRkFMU0V9CnNob290aW5nX2RhdGEgPC0gc2hvb3RpbmdfZGF0YSAlPiUKICBtdXRhdGUobG9uZ2l0dWRlID0gcHVsbChjb29yZHMsbG9uKSwKICAgICAgICAgbGF0aXR1ZGUgPSBwdWxsKGNvb3JkcyxsYXQpKQpgYGAKCkluIHRoaXMgY2FzZSB3ZSB1c2UgdGhlIGBwdWxsKClgIGZ1bmN0aW9uIHRvIGdyYWIgdGhlIGBsYXRgIGFuZCBgbG9uYCB2YXJpYWJsZXMgd2l0aGluIHRoZSBgY29vcmRzYCB0aWJibGUgd2hpY2ggaXMgYSB2YXJpYWJsZSBvZiB0aGUgYHNob290aW5nX2RhdGFgIHRpYmJsZS4KCldlIGNhbiBub3cgcmVtb3ZlIHRoZSBgY29vcmRzYCB0aWJibGUgbGlrZSBzbywgdXNpbmcgdGhlIGBzZWxlY3QoKWAgZnVudGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlOgoKYGBge3IsIGV2YWwgPSBGQUxTRX0gIApzaG9vdGluZ19kYXRhIDwtIHNob290aW5nX2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCgtY29vcmRzKQoKYGBgCgoKTm93IHVzaW5nIGBnbGltcHNlKClgIGFuZCBsb29raW5nIGF0IHRoZSBsYXN0IHNldmVyYWwgdmFyaWFibGVzLCB3ZSBjYW4gc2VlIHRoYXQgd2Ugbm8gbG9uZ2VyIGhhdmUgYSBgY29vcmRzYCB2YXJpYWJsZSwgYnV0IHdlIGRvIGhhdmUgdHdvIHZhcmlhYmxlcyBjYWxsZCBgbG9uZ2l0dWRlYCBhbmQgYGxhdGl0dWRlYCB0aGF0IGFyZSBvZiBjbGFzcyBkb3VibGUgYXMgaW5kaWNhdGVkIGJ5IHRoZSBgPGRibD5gOgoKYGBge3IsZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjgwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJkb3VibGUucG5nIikpCmBgYAoKCk5vdyB3ZSB3aWxsIHNhdmUgdGhlIGdlb2NvZGVkIGRhdGEgaW4gdGhlIGBwcm9jZXNzZWRfZGF0YWAgZGlyZWN0b3J5IHVzaW5nIHRoZSBgd3JpdGVfY3N2YCBmdW5jdGlvbiBvZiB0aGUgYHJlYWRyYCBwYWNrYWdlLgoKVGhpcyByZXF1aXJlcyBsaXN0aW5nIHRoZSBSIG9iamVjdCwgZm9sbG93ZWQgYnkgdGhlIHBhdGggZm9yIHdoZXJlIHRoZSBmaWxlIHNob3VsZCBiZSBzYXZlZCBhbmQgd2hhdCBpdCBzaG91bGQgYmUgY2FsbGVkLiBJbiB0aGlzIGNhc2UgaXQgd2lsbCBiZSBjYWxsZWQgInNob290aW5nX2RhdGEuY3N2Ii4KCmBgYHtyLCBldmFsID0gRkFMU0V9IApyZWFkcjo6d3JpdGVfY3N2KHNob290aW5nX2RhdGEsIHBhdGggPSBoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhX2dlby5jc3YiKSkKCmBgYAoKCkdyZWF0IG5vdyB3ZSB3aWxsIHdvcmsgd2l0aCB0aGlzIGRhdGEsIHRodXMgeW91IGRvIG5vdCBuZWVkIHRvIGdldCBhbiBBUEkga2V5IHRvIGdldCB0byB0aGlzIHBvaW50LiBXZSBjYW4gcmVhZCBvdXIgcHJvY2Vzc2VkIGdlb2NvZGVkIGRhdGEgaW50byBSIGJ5IHVzaW5nIHRoZSBgcmVhZF9jc3YoKWAgZnVuY3Rpb24gb2YgdGhlIGByZWFkcmAgcGFja2FnZS4KCmBgYHtyfQoKc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCA8LSByZWFkX2NzdihoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgInNob290aW5nX2RhdGFfZ2VvLmNzdiIpKQpgYGAKCgoKIyMjIEdlb21ldHJ5IGxpc3RzIHdpdGggdGhlIGBzZmAgcGFja2FnZQoKRnJvbSB0aGlzIHNlY3Rpb24gb24sIHdlIGFyZSBub3cgZ29pbmcgdG8gdXNlIGEgc3BlY2lhbCBwaXBlIG9wZXJhdG9yIGZyb20gdGhlIFtgbWFncml0dHJgIHBhY2thZ2VdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9tYWdyaXR0ci92aWduZXR0ZXMvbWFncml0dHIuaHRtbCkgY2FsbGVkIHRoZSBjb21wb3VuZCBhc3NpZ25tZW50IHBpcGUtb3BlcmF0b3Igb3Igc29tZXRpbWVzIHRoZSBkb3VibGUgcGlwZSBvcGVyYXRvciwgdGhhdCBsb29rcyBsaWtlIHRoaXMgYCU8PiVgLiAKClRoaXMgYWxsb3dzIHVzIHRvIHVzZSB0aGUgYW4gaW5wdXQgYW5kIHJlYXNzaWduIGl0IGF0IHRoZSBlbmQgYWZ0ZXIgYWxsIHRoZSBzdWJzZXF1ZW50IHN0ZXBzIGhhdmUgYmVlbiBwZXJmb3JtZWQuIFdlIGNhbiB0aGVyZWZvcmUgdXNlIGBkYXRhX2lucHV0ICU8PiVgIGluc3RlYWQgb2YgYGRhdGFfaW5wdXQgPC0gZGF0YV9pbnB1dCAlPiVgLiBXZSB3aWxsIGRlb21vbnN0cmF0ZSB0aGlzIGluIHRoZSBjb2RlIGJlbG93LgoKV2Ugd2lsbCB1c2UgdGhlIGBzZmAgKHdoaWNoIHN0YW5kcyBmb3Igc2ltcGxlIGZlYXR1cmVzKSBwYWNrYWdlIHRvIApjcmVhdGUgd2hhdCBpcyBjYWxsZWQgYSBnZW9tZXRyeSBsaXN0IG9mIG91ciBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlICBpbmZvcm1hdGlvbiBmb3IgdGhlIHNjaG9vbHMgd2hlcmUgc2hvb3RpbmdzIG9jY3VyZWQuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBjcmVhdGUgYSBtYXAgb2YgdGhlc2UgZXZlbnRzLgoKClRoZSBmaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNyZWF0ZSBhbiBzZiBvYmplY3QgKG1lYW5pbmcgYW4gb2JqZWN0IHRoYXQgdGhlIGBzZmAgcGFja2FnZSByZWNvZ25pemVzKSB1c2luZyB0aGUgYHN0X2FzX3NmKClgIGZ1bmN0aW9uLgoKSG93ZXZlciwgdG8gZG8gdGhpcyB3ZSBmaXJzdCBuZWVkIHRvIHJlbW92ZSByb3dzIHdpdGggYE5BYCB2YWx1ZXMgZm9yIHRoZSBgbGF0aXR1ZGVgIGFuZCBgbG9uZ2l0dWRlYCB2YXJpYWJsZXMuIEluIG90aGVyd29yZHMsIHdlIG5lZWQgdG8gcmVtb3ZlIHJvd3Mgb2YgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYXQgc2Nob29scyB3aXRoIGxvY2F0aW9ucyB0aGF0IHdlcmUgbm90IGlkZW50aWZpZWQgYnkgZ29vZ2xlLiBXZSBjYW4gcmVtb3ZlIHRoaXMgcm93cyB1c2luZyB0aGUgYGRyb3BfbmEoKWAgZnVuY3Rpb24gb2YgdGhlIGB0aWR5cmAgcGFja2FnZS4gV2Ugd2lsbCB1c2UgYSBgLmAgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3YW50IHRvIHVzZSB0aGUgZGF0YSB0aGF0IHdlIGFyZSB1c2luZyBhcyBhbiBpbnB1dCB3aXRoIG91ciBwaXBlLCBidXQgdGhlbiB3ZSB3aWxsIHNwZWNpZnkgdGhhdCB3ZSB3YW50IHRvIG9ubHkgZHJvcCByb3dzIHdlcmUgdGhlcmUgaXMgYW4gYE5BYCB2YWx1ZSBmb3IgZWl0aGVyIHRoZSBgbGF0aXR1ZGVgIG9yIGBsb25naXR1ZGVgIHZhcmlhYmxlcy4KCgpgYGB7cn0KZGltKHNob290aW5nX2RhdGFfZ2VvY29kZWQpCgpzaG9vdGluZ19kYXRhX2dlb2NvZGVkICU+JSBmaWx0ZXIoaXMubmEobGF0aXR1ZGUpKSAlPiVzZWxlY3QobWF0Y2hlcyhjKCJsb25nIiwgImxhdCIsICJhZGQiKSkpCmBgYAoKYGBge3J9CgojdXNpbmcgcHJldmlvdXMgbWV0aG9kOgojIHNob290aW5nX2RhdGFfZ2VvY29kZWQgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPiUKIyAgICB0aWR5cjo6ZHJvcF9uYSguLCBjKGxhdGl0dWRlLCBsb25naXR1ZGUpKQoKI3VzaW5nIG1hZ3JpdHRyICU8PiUgY29tcG91bmQgYXNzaWdubWVudCBwaXBlLW9wZXJhdG9yCnNob290aW5nX2RhdGFfZ2VvY29kZWQgJTw+JQogdGlkeXI6OmRyb3BfbmEoLiwgYyhsYXRpdHVkZSwgbG9uZ2l0dWRlKSkKYGBgCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpkaW0oc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCkKCmNvbHNfdG9fc2VsZWN0IDwtYygiU2Nob29sIiwiRGF0ZSIsIlN0YXRlIiwgIkNpdHkiLCAiTmFycmF0aXZlIChEZXRhaWxlZCBTdW1tYXJ5LyBCYWNrZ3JvdW5kKSIsICJLaWxsZWQgKGluY2x1ZGVzIHNob290ZXIpIikKCnNldGRpZmYoc2VsZWN0KHNob290aW5nX2RhdGEsIGNvbHNfdG9fc2VsZWN0KSwKICAgICAgICBzZWxlY3Qoc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCwgY29sc190b19zZWxlY3QpKQpgYGAKCgpOb3cgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHZhcmlhYmxlcyBpbiBvdXIgZGF0YSByZWxhdGVkIHRvIGxvY2F0aW9uIGJ5IHVzaW5nIHRoZSBgc2VsZWN0KClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2U6CgpgYGB7cn0Kc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPiUKICBzZWxlY3QoU2Nob29sLCBDaXR5LCBTdGF0ZSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSkKYGBgCgpXZSBjYW4gc2VlICh1c2luZyB0aGUgYmFzZSBgZGltKClgIGZ1bmN0aW9uKSB0aGF0IHRoZSBkaW1lbnNpb25zIHdlcmUgMTE1NiByb3dzIG9mIDUxIHZhcmlhYmxlcywgYnV0IHRoZXkgYXJlIG5vdyAxNTUxIHJvd3Mgb2YgNTAgdmFyaWFibGVzLiBUaGlzIGlzIGJlY3Vhc2UgNSBldmVudHMgb2NjdXJlZCBhdCBzY2hvb2xzIHdpdGggdW5pZGVudGlmaWVkIGNvbXBsZXRlIGxvY2F0aW9ucyAobWlzc2luZyBlaXRoZXIgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgb3IgYm90aCkuIAoKTm93LCB3ZSBhcmUgcmVhZHkgdG8gY29udmVydCBvdXIgY29vcmRpbmF0ZXMgdmFyaWFibGVzIChgbGF0aXR1ZGVgIGFuZCBgbG9uZ2l0dWRlYCkgaW50byBhIGNvb3JkaWFudGUgc2ltcGxlIGZlYXR1cmUgdXNpbmcgdGhlIGBzdF9hc19zZigpYCBmdW5jdGlvbi4gV2UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgb3VyIGNvb3JkaW5hdGUgdmFyaWFibGVzIGFyZSBhbmQgd2Ugd2lsbCBhbHNvIHNwZWNpZnkgd2hhdCBbY29vcmRpbmF0ZSByZWZlcmVuY2Ugc3lzdGVtXShodHRwczovL3d3dy53My5vcmcvMjAxNS9zcGF0aWFsL3dpa2kvQ29vcmRpbmF0ZV9SZWZlcmVuY2VfU3lzdGVtcyksKGNycykgd2Ugd291bGQgbGlrZSB0byB1c2UuIEluIG91ciBjYXNlIHdlIHdpbGwgdXNlIHRoZSBbRVNQR10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRVBTR19HZW9kZXRpY19QYXJhbWV0ZXJfRGF0YXNldCkgcmVmZXJlbmNlIG51bWJlciBbNDMyNl0oaHR0cHM6Ly9zcGF0aWFscmVmZXJlbmNlLm9yZy9yZWYvZXBzZy80MzI2LyksIGtub3duIGFzIEVTUEc6NDMyNiBvciB0aGUgW1dvcmxkIEdlb2RldGljIFN5c3RlbSAoV0dTKSB2ZXJzaW9uIDg0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Xb3JsZF9HZW9kZXRpY19TeXN0ZW0jV0dTODQpIHdoaWNoIGlzIG9uZSBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIENQUyBhbmQgdXNlZCBieSBieSBtb3N0IGdsb2JhbCBwb3NpdGlvbmluZyBzeXN0ZW1zLCBrbm93biBhcyBHUFMuICoqVGhpcyB0ZWxscyBSICB0byB1c2UgdGhlIHZhbHVlcyBmb3IgdGhlIHZhcmlhYmxlcyBjYWxsZWQgYGxhdGl0dWRlYCBhbmQgYGxvbmdpdHVkZWAgYXMgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBjb29yZGluYXRlcy4qKgoKYGBge3J9CnNob290aW5nX2RhdGFfZ2VvY29kZWQgJTw+JQogIHNmOjpzdF9hc19zZihjb29yZHMgPSBjKCJsb25naXR1ZGUiLCAibGF0aXR1ZGUiKSwgY3JzID0gNDMyNikKCmRpbShzaG9vdGluZ19kYXRhX2dlb2NvZGVkKQoKYGBgCgpXZSBjYW4gc2VlIHRoYXQgb3VyIGBsYXRpdHVkZWAgYW5kIGBsb25naXR1ZGVgIHZhcmlhYmxlcyB3ZXJlIHVzZWQgdG8gY3JlYXRlIGEgc2luZ2xlIG5ldyB2YXJpYWJsZSBjYWxsZWQgYGdlb21ldHJ5YCBvZiBjbGFzcyAgYDxQT0lOVGAgWyRee1xjaXJjfSRdYD5gLCB0aHVzIHdlIGhhdmUgb25lIGxlc3MgY29sdW1uLgoKSW4gdGhpcyBjYXNlLCB3ZSBjYW4gdGFrZSBhIGxvb2sgYXQganVzdCB0aGUgZmlyc3QgNCB2YXJpYWJsZXMgYW5kIHdlIHdpbGwgYWxzbyBzZWUgb3VyIGxhc3QgYHNmYCB2YXJpYWJsZSBhcyB3ZWxsIGFwcGVuZWRlZCBhdCB0aGUgZW5kLiBTbyBub3cgd2UgY2FuIHNlZSB0aGUgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbG9jYXRpb24gYnkgc2ltcGx5IHR5cGluZyBgWzE6NF1gIG5leHQgdG8gdGhlIG5hbWUgb2Ygb3VyIHRpYmJsZSBgc2hvb3RpbmdfZGF0YV9nZW9jb2RlZGAuCgpgYGB7cn0Kc2hvb3RpbmdfZGF0YV9nZW9jb2RlZFsxOjRdCmBgYAoKCk5vdyB0byBhbGxvdyBvdXIgcG9pbnRzIHRvIG5vdCBvdmVybGFwIGZvciBldmVudHMgdGhhdCB0b29rIHBsYWNlIGluIHRoZSBzYW1lIGxvY2F0aW9uLCB3ZSB3aWxsIGFkZCBhIGJpdCBtb3JlIHJhbmdlIHNvIHRoYXQgdGhleSBkb24ndCBvdmVybGFwIG9uZSBhbm90aGVyIG9uIG91ciBtYXAsIHdlIHdpbGwgdHJhbnNmb3JtIHRoZSBjb29yZGluYXRlcyB1c2luZyB0aGUgYHN0X3RyYW5zZm9ybSgpYCBmdW5jdGlvbiAgb2YgdGhlIGBzZmAgcGFja2FnZSBpbnRvIGEgdHdvIGRpbWVuc2lvbmFsIHByb2plY3Rpb24gKGNhbGxlZCB0aGUgW0FsYmVycyBlcXVhbC1hcmVhIGNvbmljIHByb2plY3Rpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FsYmVyc19wcm9qZWN0aW9uIzp+OnRleHQ9VGhlJTIwQWxiZXJzJTIwZXF1YWwlMkRhcmVhJTIwY29uaWMsdGhhdCUyMHVzZXMlMjB0d28lMjBzdGFuZGFyZCUyMHBhcmFsbGVscy4mdGV4dD1UaGUlMjBBbGJlcnMlMjBwcm9qZWN0aW9uJTIwaXMlMjB1c2VkLHRoZSUyMFVuaXRlZCUyMFN0YXRlcyUyMENlbnN1cyUyMEJ1cmVhdS4pKSB3aXRoIHVuaXRzIGluIG1ldGVycyB1c2luZyB0aGUgW2NycyAxMDIwMDhdKGh0dHBzOi8vc3BhdGlhbHJlZmVyZW5jZS5vcmcvcmVmL2VzcmkvMTAyMDA4L2h0bWwvKSBhbmQgdGhlbiB1c2UgdGhlIGBzdF9qaXR0ZXIoKWAgb2YgdGhlIGBzZmAgcGFja2FnZSBmdW5jdGlvbgp0byBhbGxvdyBhIHNwZWNpZmllZCBhbW91bnQgb2YgcmFuZ2UgbmVhciB0aGUgYWN0dWFsIG9yaWdpbmFsIEdQUyBjb29yZGluYXRlcy4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgYWxsb3cgZm9yIDUwIG1ldGVycyBvZiByYW5nZS4KClRvIGxlYXJuIG1vcmUgYWJvdXQgZ2Vvc3BhdGlhbCBjb29yZGluYXRlIHN5c3RlbXMgc2VlIFtoZXJlXShodHRwczovL3d3dy5uY2Vhcy51Y3NiLmVkdS9zaXRlcy9kZWZhdWx0L2ZpbGVzLzIwMjAtMDQvT3ZlcnZpZXdDb29yZGluYXRlUmVmZXJlbmNlU3lzdGVtcy5wZGYpIGFuZCBbaGVyZV0oaHR0cHM6Ly9ndWlkZXMubGlicmFyeS5kdWtlLmVkdS9yLWdlb3NwYXRpYWwvQ1JTKS4KClNvIGhlcmUgd2UgY2FuIHNlZSB0aGUgb3V0cHV0IGFmdGVyIHRyYW5zZm9ybWluZyBvdXIgZGF0YToKCmBgYHtyfQpzaG9vdGluZ19kYXRhX2dlb2NvZGVkICAlPD4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDEwMjAwOCkgCmBgYAoKYGBge3J9CnNob290aW5nX2RhdGFfZ2VvY29kZWRbMTo0XQpgYGAKQW5kIGhlcmUgd2UgY2FuIHNlZSB0aGUgb3V0cHV0IGFmdGVyIGFkZGluZyB0aGUgaml0dGVyOgoKYGBge3J9CnNob290aW5nX2RhdGFfZ2VvY29kZWQgICU8PiUKICAgc3Rfaml0dGVyKGFtb3VudCA9IDUwKQoKc2hvb3RpbmdfZGF0YV9nZW9jb2RlZFsxOjRdCmBgYAoKTm90aWNlIGhvdyB0aGUgYGdlb21ldHJ5YCB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLgoKTm93IHdlIHdpbGwgdHJhbnNmb3JtIG91ciBjb29yZGluYXRlcyBiYWNrIGludG8gdGhlIDNEIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZGVncmVlIHN5c3RlbSBhZ2FpbiB1c2luZyB0aGUgYHN0X3RyYW5zZm9ybSgpYCBmdW5jdGlvbiBhbmQgdGhlIFtFU1BHOjQzMjZdKGh0dHBzOi8vc3BhdGlhbHJlZmVyZW5jZS5vcmcvcmVmL2Vwc2cvNDMyNi8pLCBjb3JyZGluYXRlIHN5c3RlbS4KCmBgYHtyfQpzaG9vdGluZ19kYXRhX2dlb2NvZGVkICAlPD4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDQzMjYpCgpzaG9vdGluZ19kYXRhX2dlb2NvZGVkWzE6NF0KYGBgCgpOb3RpY2UgaG93IHRoZSBgZ2VvbWV0cnlgIHZhcmlhYmxlcyBhcmUgZGlmZmVyZW50IGZyb20gd2hhdCB0aGV5IHdlcmUgb3JnaW5hbGx5IHdpdGggdGhpcyBjb29yZGluYXRlIHN5c3RlbToKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0gIjkwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJnZW9tZXRyeS5wbmciKSkKYGBgCgoKTm93IHdlIHdpbGwgc2VwYXJhdGUgdGhlIGBnZW9tZXRyeWAgdmFyaWFibGUgaW50byBgbG9uZ2l0dWRlYCBhbmQgYGxhdGl0dWRlYCB2YXJpYWJsZXMgYWdhaW4uIFdlIGNhbiB1c2UgdGhlIGAgc3RfY29vcmRpbmF0ZXMoKWAgZnVuY3Rpb24gb2YgdGhlIGBzZmAgcGFja2FnZSB0byBleHRyYWN0IHRoZSBjb29yZGluYXRlcyBmcm9tIG91ciB0aWJibGUgYXMgYSBtYXRyaXguCgpgYGB7cn0Kc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPD4lIAogIG11dGF0ZShjb29yZGluYXRlcyA9IGFzLnRpYmJsZShzdF9jb29yZGluYXRlcyguKSkpCgpzaG9vdGluZ19kYXRhX2dlb2NvZGVkICU+JQogIHB1bGwoY29vcmRpbmF0ZXMpICU+JQogIHNsaWNlX2hlYWQobiA9IDQpCmBgYAoKTm93LCBqdXN0IGFzIHdlIGRpZCBwcmV2aW91c2x5IHdlIHdpbGwgY3JlYXRlIG5ldyB2YXJpYWJsZXMgY2FsbGVkIGBsYXRpdHVkZWAgYW5kIGBsb25naXR1ZGVgIGZyb20gdGhlIGBYYCBhbmQgYFlgIHZhcmlhYmxlcyB3aXRoaW4gdGhlIGBjb29yZGluYXRlc2AgdGliYmxlIHRoYXQgaXMgcGFydCBvZiBvdXIgYHNob290aW5nX2RhdGFfZ2VvY29kZWRgIHVzaW5nIHRoZSBgcHVsbCgpYCBmdW5jdGlvbi4KCldlIHdpbGwgYWxzbyBjb252ZXJ0IG91ciBgc2hvb3RpbmdfZGF0YV9nZW9jb2RlZGAgb2JqZWN0IHdoaWNoIGlzIGN1cnJlbnRseSBhIGBzZmAgaW50byBhIHRpYmJsZSB1c2luZyB0aGUgYGFzX3RpYmJsZSgpYCBmdW5jdGlvbiBvZiB0aGUgYHRpYmJsZWAgcGFja2FnZSBhbmQgdGhlbiB3ZSB3aWxsIHJlbW92ZSB0aGUgYGdlb21ldHJ5YCBhbmQgYGNvb3JkaW5hdGVzYCB2YXJpYWJsZXMgdXNpbmcgdGhlIGBzZWxlY3QoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZSB3aXRoIGEgbmVnYXRpdmUgc2lnbiBpbmZyb250IG9mIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHRvIHJlbW92ZS4KCmBgYHtyfQpzaG9vdGluZ19kYXRhX2dlb2NvZGVkICU8PiUKICBtdXRhdGUobG9uZ2l0dWRlID0gcHVsbChjb29yZGluYXRlcyxYKSwKICAgICAgICAgIGxhdGl0dWRlID0gcHVsbChjb29yZGluYXRlcyxZKSkgJT4lCiAgdGliYmxlOjphc190aWJibGUoKSAlPiUKICBzZWxlY3QoLWdlb21ldHJ5KSAlPiUKICBzZWxlY3QoLWNvb3JkaW5hdGVzKQpgYGAKCkFuZCBub3cgd2UgY2FuIHRha2UgYSBsb29rIGF0ICBvdXIgbGFzdCAzIHZhcmlhYmxlcyB1c2luZyB0aGUgYGxhc3RfY29sKClgIGZ1bmN0aW9uLCB3aGljaCBpcyBhIHNlbGVjdCBoZWxwZXIgZnVuY3Rpb24gYHRpZHlyYCBwYWNrYWdlLiBTZWUgW2hlcmVdKGh0dHBzOi8vdGlkeXNlbGVjdC5yLWxpYi5vcmcvcmVmZXJlbmNlL3NlbGVjdF9oZWxwZXJzLmh0bWwpIGZvciBvdGhlciBzZWxlY3QgaGVscGVyIGZ1bmN0aW9ucy4gVGhpcyBhbGxvd3MgdXMgdG8gc2VsZWN0IGVpdGhlciB0aGUgbGFzdCBjb2x1bW4sIG9yIHdpdGggYSBzcGVjaWZpZWQgb2Zmc2V0IHdlIGNhbiBzZWxlY3QgYSBudW1iZXIgb2YgY29sdW1ucyBiZWZvcmUgdGhlIGxhc3QgY29sdW1uLiBUaHVzIDIgY29sdW1ucyBiZWZvcmUgdGhlIGxhc3QgY29sdW1uICB3b3VsZCBiZSBgbGFzdF9jb2wob2Zmc2V0ID0gMilgIGFuZCB0aGVuIHRoZSBgOmAgc3ltYm9sIGlzIGludGVycHJldGVkIGFzIHRocm91Z2gsIHRodXMgd2UgYXJlIHNlbGVjdGluZyBmb3IgdGhlIHRoaXJkIHRvIGxhc3QgY29sdW1uIHRocm91Z2ggdGhlIGxhc3QgY29sdW1uIHdpdGggYGxhc3RfY29sKG9mZnNldCA9IDIpOiBsYXN0X2NvbCgpYC4KCmBgYHtyfQpzaG9vdGluZ19kYXRhX2dlb2NvZGVkICU+JSAKICBzZWxlY3QobGFzdF9jb2wob2Zmc2V0ID0gMik6bGFzdF9jb2woKSkgJT4lIAogIHNsaWNlX2hlYWQobiA9IDQpCgpgYGAKCgpHcmVhdCEgVGhhdCBsb29rcyBsaWtlIHdlIGV4cGVjdGVkLiBXZSBjYW4gc2VlIHRoYXQgdGhlIGNvb3JkaW5hdGUgdmFsdWVzIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQgbm93LgoKYGBge3J9Cm9yaWdpbmFsX3Nob290aW5nX2RhdGFfZ2VvY29kZWQgPC0gcmVhZF9jc3YoaGVyZSgicHJvY2Vzc2VkX2RhdGEiLAogICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhLmNzdiIpKQoKb3JpZ2luYWxfc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPiVzZWxlY3QobG9uZ2l0dWRlLCBsYXRpdHVkZSkgJT4lIHNsaWNlX2hlYWQobiA9IDQpCmBgYAoKCgoKIyMjIyB7LnNjcm9sbGFibGUgfQpgYGB7cn0Kc3RyKHNob290aW5nX2RhdGFfZ2VvY29kZWQpCgpgYGAKCiMjIyMKCkxvb2tzIGdvb2QhCgpOb3cgd2Ugd2lsbCBzYXZlIG91ciB3cmFuZ2xlZCBkYXRhLCBhZ2FpbiB1c2luZyBgd3JpdGVfY3N2KClgLgoKYGBge3IsIGV2YWwgPSBGQUxTRX0KCnJlYWRyOjp3cml0ZV9jc3Yoc2hvb3RpbmdfZGF0YSwgcGF0aCA9IGhlcmUoInByb2Nlc3NlZF9kYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob290aW5nX2RhdGFfcHJlX2dlb193cmFuZ2xlZC5jc3YiKSkKd3JpdGVfY3N2KHNob290aW5nX2RhdGFfZ2VvY29kZWQsIHBhdGggPSBoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhX3dyYW5nbGVkLmNzdiIpKQpgYGAKCgoKZnJvbSBNaWNoYWVsOgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpzaG9vdGluZ19kYXRhX2dlb2NvZGVkIDwtIHJlYWRfY3N2KGhlcmUoInByb2Nlc3NlZF9kYXRhIiwKICAgICAgICAgICAgICAic2hvb3RpbmdfZGF0YS5jc3YiKSkKc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCA8LSBzaG9vdGluZ19kYXRhX2dlb2NvZGVkICU+JQogIGZpbHRlcighaXMubmEobG9uZ2l0dWRlKSwKICAgICAgICAgIWlzLm5hKGxhdGl0dWRlKSkgJT4lCiAgc2Y6OnN0X2FzX3NmKGNvb3JkcyA9IGMoImxvbmdpdHVkZSIsICJsYXRpdHVkZSIpLCBjcnMgPSA0MzI2KSAlPiUKICAKICBzdF90cmFuc2Zvcm0oY3JzID0gMTAyMDA4KSAlPiUKICBzdF9qaXR0ZXIoYW1vdW50ID0gNTApICU+JQogIHN0X3RyYW5zZm9ybShjcnMgPSA0MzI2KSAlPiUKICBtdXRhdGUobG9uZ2l0dWRlID0gc3RfY29vcmRpbmF0ZXMoLilbLDFdLAogICAgICAgICBsYXRpdHVkZSA9IHN0X2Nvb3JkaW5hdGVzKC4pWywyXSkgJT4lCiAgYXNfdGliYmxlKCkgJT4lCiAgZHBseXI6OnNlbGVjdCgtZ2VvbWV0cnkpCgpzdGF0ZV9kZiA8LSBhc190aWJibGUoY2JpbmQoc3RhdGUuYWJiLCBzdGF0ZS5uYW1lKSkKCnNob290aW5nX2RhdGFfZ2VvY29kZWQgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPiUKICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyVZIikpICU+JQogIG11dGF0ZShEYXRlX3llYXIgPSB5ZWFyKERhdGUpKSAlPiUKICByZW5hbWUoIlN0YXRlX2FiYiIgPSBTdGF0ZSkgJT4lCiAgbGVmdF9qb2luKHN0YXRlX2RmLCBieSA9IGMoIlN0YXRlX2FiYiIgPSAic3RhdGUuYWJiIikpICU+JQogIHJlbmFtZSgiU3RhdGUiID0gc3RhdGUubmFtZSkgJT4lCiAgbXV0YXRlKFN0YXRlID0gc3RyX3RvX3RpdGxlKHRvbG93ZXIoU3RhdGUpKSkgJT4lCiAgbXV0YXRlKGBTdWljaWRlIChvciBhdHRlbXB0ZWQgc3VpY2lkZSkgYnkgU2hvb3RlciAoWS9OKWAgPSBjYXNlX3doZW4oYFN1aWNpZGUgKG9yIGF0dGVtcHRlZCBzdWljaWRlKSBieSBTaG9vdGVyIChZL04pYCA9PSAiWWVzIiB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IEZBTFNFKSkKCnN0YXJ0IDwtIDE5NzAKZW5kIDwtIDIwMjAKCndyaXRlX2NzdihzaG9vdGluZ19kYXRhX2dlb2NvZGVkLCBwYXRoID0gaGVyZSgicHJvY2Vzc2VkX2RhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob290aW5nX2RhdGFfd3JhbmdsZWQuY3N2IikpCgpybShzaG9vdGluZ19kYXRhX2dlb2NvZGVkKQoKc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCA8LSByZWFkX2NzdihoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvb3RpbmdfZGF0YV93cmFuZ2xlZC5jc3YiKSkKYGBgCgoKCklOVFJPRFVDRSBUSEUgQ09OQ0VQVCBPRiBEQVNIQk9BUkRTCgpJTlRST0RVQ0UgYGZsZXhkYXNoYm9hcmRgCgojIyAqKkRhdGEgQW5hbHlzaXMgYW5kIFZpc3VhbGl6YXRpb24qKgoqKiogCgpGaXJzdCBsZXQncyBsb2FkIHRoZSBkYXRhIGJ5IHJlYWRpbmcgaW4gb3VyIHdyYW5nbGVkIHZlcnNpb24gb2YgdGhlIGRhdGEuCgpgYGB7cn0Kc2hvb3RpbmdfZGF0YSA8LSByZWFkX2NzdihoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvb3RpbmdfZGF0YV9wcmVfZ2VvX3dyYW5nbGVkLmNzdiIpKQoKc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCA8LSByZWFkX2NzdihoZXJlKCJwcm9jZXNzZWRfZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvb3RpbmdfZGF0YV93cmFuZ2xlZC5jc3YiKSkKYGBgCgoKVGhlcmUgYXJlIHNldmVyYWwgZWxlbWVudHMgd2Ugd291bGQgbGlrZSB0byBpbmNsdWRlIGluIG91ciBkYXNoYm9hcmQuIAoKT25lIHRoaW5nIHdlIHdvdWxkIGxpa2UgaXMgYW4gaW50ZXJhY3RpdmUgdGFibGUuCgpXZSBjYW4gZG9uZSBzbyB1c2luZyB0aGUgYGRhdGF0YWJsZSgpYCBmdW5jdGlvbiBvZiB0aGUgYERUYCBwYWNrYWdlLgoKYGBge3IsIGV2YWwgPSBGQUxTRX0KRFQ6OmRhdGF0YWJsZShzaG9vdGluZ19kYXRhKQpgYGAKVGhpcyBjcmVhdGVzIGEgc2VhcmNoYWJsZSB0YWJsZSBhbmQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkYXRhIGlzIGRpc3BsYXllZCBjYW4gYmUgdG9nZ2xlZCB0byBjaGFuZ2UgZm9yIGVhY2ggdmFyaWFibGUuCgpIb3dldmVyLCB3ZSBoYXZlIG1hbnkgdmFyYWlibGVzLCBzbyB0aGlzIGdldCdzIHRvIGJlIG92ZXJ3aGVsbWluZy4gU2luY2UgdGhlcmUgYXJlIHNvIG1hbnkgdGhpcyBldmVuIG1vZGlmaWVzIHRoZSB3YXkgdGhlIHJtYXJrZG93biBmb3IgdGhpcyBjYXNlIHN0dWR5IGlzIHJlbmRlcmVkLCB0aHVzIGluc3RlYWQgb2YgZGlzcGxheWluZyBhbGwgb2YgdGhlIHZhcmlhYmxlcywgbGV0J3MgY2hvb3NlIG9ubHkgc29tZSBvZiB0aGUgbW9zdCBpbnRlcmVzdGluZyB0byBkaXNwbGF5IG9uIG91ciBkYXNoYm9hcmQuCgoKYGBge3J9CkRUX3RhYmxlIDwtIHNob290aW5nX2RhdGElPiUKICBkcGx5cjo6c2VsZWN0KERhdGUsCiAgICAgICAgICAgICAgICBTY2hvb2wsCiAgICAgICAgICAgICAgICBDaXR5LAogICAgICAgICAgICAgICAgU3RhdGUsCiAgICAgICAgICAgICAgICBgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWAsCiAgICAgICAgICAgICAgICBgTmFycmF0aXZlIChEZXRhaWxlZCBTdW1tYXJ5LyBCYWNrZ3JvdW5kKWApICU+JQogIHJlbmFtZSgiRGVhdGhzIiA9IGBLaWxsZWQgKGluY2x1ZGVzIHNob290ZXIpYCkgJT4lCiAgcmVuYW1lKCJOYXJyYXRpdmUiID0gYE5hcnJhdGl2ZSAoRGV0YWlsZWQgU3VtbWFyeS8gQmFja2dyb3VuZClgKQoKRFQ6OmRhdGF0YWJsZShEVF90YWJsZSkKYGBgCgoKTm93IHdlIHdvdWxkIGFsc28gbGlrZSB0byBtYWtlIHNvbWUgdmlzdWFsaXphdGlvbnMgb2Ygb3VyIGRhdGEuCgojIyMgWWVhcmx5IFNob290aW5ncwoKRmlyc3QsIHdlIHdvdWxkIGxpa2UgdG8gY3JlYXRlIGEgcGxvdCBvZiB0aGUgbnVtYmVyIG9mIHNob290aW5ncyBwZXIgeWVhci4KClRvIGRvIHRoaXMgd2Ugd2lsbCBmaXJzdCBjb3VudCB0aGUgbnVtYmVyIG9mIHNob290aW5ncyBwZXIgeWVhciBieSB1c2luZyB0aGUgYGdyb3VwX2J5KClgIGZ1bmN0aW9uICBhbmQgdGhlIGBjb3VudCgpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlLiBUaGUgYGdyb3VwX2J5KClgIGZ1bmN0aW9ucyBhbGxvd3MgdXMgdG8gc3VtbWFyaXplIHRoZSBkYXRhIGFjcm9zcyBzcGVjaWZpYyBncm91cHMgc3BlY2lmaWVkIGJ5IGEgdmFyaWFibGUgb3IgbXVsdGlwbGUgdmFyaWFibGVzLiBCeSBncm91cGluZyBieSBgRGF0ZV95ZWFyYCB3ZSBjYW4gdGhlbiB1c2UgdGhlIGBjb3VudCgpYCBmdW5jdGlvbiB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJvd3Mgd2l0aCBzaG9vdGluZyBldmVudCBpbmZvcm1hdGlvbiAKZm9yIGVhY2ggdW5pcXVlIHZhbHVlIG9mIHRoZSBgRGF0ZV95ZWFyYCB2YXJpYWJsZS4KCldlIHRoZW4gd2FudCB0byB1c2UgdGhlIGB1bmdyb3VwKClgIGZ1bmN0aW9uIHRvIGdldCB0aGUgZGF0YSBvdXQgb2YgdGhpcyBncm91cGluZyBiYXNlZCBvbiB0aGUgYERhdGFfeWVhcmAgdmFyYWlibGUuCgoKYGBge3J9CgpzaG9vdGluZ3NfcGVyX3llYXI8LSBzaG9vdGluZ19kYXRhICU+JQogICAgZ3JvdXBfYnkoRGF0ZV95ZWFyKSAlPiUKICAgIGNvdW50KCkgJT4lCiAgcmVuYW1lKCJTaG9vdGluZ3MiID0gbikgJT4lCiAgICB1bmdyb3VwKCkKCgpzaG9vdGluZ3NfcGVyX3llYXIKCmBgYApOaWNlIGxvb2tzIGdvb2QhCgpOb3cgdG8gbWFrZSBhIHBsb3Qgb2YgdGhpcyBkYXRhIHdlIHdpbGwgdXNlIHRoZSBgZ2dwbG90MmAgcGFja2FnZS4KCjxkZXRhaWxzPjxzdW1tYXJ5PiBDbGljayBoZXJlIGZvciBhbiBpbnRyb2R1Y3Rpb24gYWJvdXQgdGhpcyBwYWNrYWdlIGlmIHlvdSBhcmUgIG5ldyB0byB1c2luZyBgZ2dwbG90MmAgPC9zdW1tYXJ5PgoKVGhlIFtnZ3Bsb3QyIHBhY2thZ2VdKGh0dHA6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcpIGlzIGdlbmVyYWxseSBpbnR1aXRpdmUgZm9yIGJlZ2lubmVycyBiZWNhdXNlIGl0IGlzIGJhc2VkIG9uIGEgIFtncmFtbWFyIG9mIGdyYXBoaWNzXShodHRwOi8vdml0YS5oYWQuY28ubnovcGFwZXJzL2xheWVyZWQtZ3JhbW1hci5odG1sKSBvciB0aGUgYGdnYCBpbiBgZ2dwbG90MmAuIApUaGUgaWRlYSBpcyB0aGF0IHlvdSBjYW4gY29uc3RydWN0IG1hbnkgc2VudGVuY2VzIGJ5IGxlYXJuaW5nIGp1c3QgYSBmZXcgbm91bnMsIGFkamVjdGl2ZXMsIGFuZCB2ZXJicy4gVGhlcmUgYXJlIHNwZWNpZmljIOKAnHdvcmRz4oCdIHRoYXQgd2Ugd2lsbCBuZWVkIHRvIGxlYXJuIGFuZCBvbmNlIHdlIGRvLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNyZWF0ZSAob3Ig4oCcd3JpdGXigJ0pIGh1bmRyZWRzIG9mIGRpZmZlcmVudCBwbG90cy4KClRoZSBjcml0aWNhbCBwYXJ0IHRvIG1ha2luZyBncmFwaGljcyB1c2luZyBgZ2dwbG90MmAgaXMgdGhlIGRhdGEgbmVlZHMgdG8gYmUgaW4gYSBfdGlkeV8gZm9ybWF0LiAKR2l2ZW4gdGhhdCB3ZSBoYXZlIGp1c3Qgc3BlbnQgdGltZSBwdXR0aW5nIG91ciBkYXRhIGluIF90aWR5XyBmb3JtYXQsIHdlIGFyZSBwcmltZWQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgYWxsIHRoYXQgYGdncGxvdDJgIGhhcyB0byBvZmZlciEgCgpXZSB3aWxsIHNob3cgaG93IGl0IGlzIGVhc3kgdG8gcGlwZSBfdGlkeV8gZGF0YSAob3V0cHV0KSBhcyBpbnB1dCB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBjcmVhdGUgcGxvdHMuIApUaGlzIGFsbCB3b3JrcyBiZWNhdXNlIHdlIGFyZSB3b3JraW5nIAp3aXRoaW4gdGhlIF90aWR5dmVyc2VfLiAKCioqV2hhdCBpcyB0aGUgYGdncGxvdCgpYCBmdW5jdGlvbj8qKiAKQXMgZXhwbGFpbmVkIGJ5IEhhZGxleSBXaWNraGFtOgoKPiBUaGUgZ3JhbW1hciB0ZWxscyB1cyB0aGF0IGEgc3RhdGlzdGljYWwgZ3JhcGhpYyBpcyBhIG1hcHBpbmcgZnJvbSBkYXRhIHRvIGFlc3RoZXRpYyBhdHRyaWJ1dGVzIChjb2xvdXIsIHNoYXBlLCBzaXplKSBvZiBnZW9tZXRyaWMgb2JqZWN0cyAocG9pbnRzLCBsaW5lcywgYmFycykuIFRoZSBwbG90IG1heSBhbHNvIGNvbnRhaW4gc3RhdGlzdGljYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBkYXRhIGFuZCBpcyBkcmF3biBvbiBhIHNwZWNpZmljIGNvb3JkaW5hdGVzIHN5c3RlbS4KCmBnZ3Bsb3QyYCBUZXJtaW5vbG9neTogCgotICoqZ2dwbG90KiogLSB0aGUgbWFpbiBmdW5jdGlvbiB3aGVyZSB5b3Ugc3BlY2lmeSB0aGUgZGF0YXNldCBhbmQgdmFyaWFibGVzIHRvIHBsb3QgKHRoaXMgaXMgd2hlcmUgd2UgZGVmaW5lIHRoZSBgeGAgYW5kCmB5YCB2YXJpYWJsZSBuYW1lcykKLSAqKmdlb21zKiogLSBnZW9tZXRyaWMgb2JqZWN0cwogICAgLSBlLmcuIGBnZW9tX3BvaW50KClgLCBgZ2VvbV9iYXIoKWAsIGBnZW9tX2xpbmUoKWAsIGBnZW9tX2hpc3RvZ3JhbSgpYAotICoqYWVzKiogLSBhZXN0aGV0aWNzCiAgICAtIHNoYXBlLCB0cmFuc3BhcmVuY3ksIGNvbG9yLCBmaWxsLCBsaW5lIHR5cGVzCi0gKipzY2FsZXMqKiAtIGRlZmluZSBob3cgeW91ciBkYXRhIHdpbGwgYmUgcGxvdHRlZAogICAgLSBjb250aW51b3VzLCBkaXNjcmV0ZSwgbG9nLCBldGMKClRoZSBmdW5jdGlvbiBgYWVzKClgIGlzIGFuIGFlc3RoZXRpYyBtYXBwaW5nIGZ1bmN0aW9uIGluc2lkZSB0aGUgYGdncGxvdCgpYCBvYmplY3QuIApXZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBzcGVjaWZ5IHBsb3QgYXR0cmlidXRlcyAoZS5nLiBgeGAgYW5kIGB5YCB2YXJpYWJsZSBuYW1lcykgdGhhdCB3aWxsIG5vdCBjaGFuZ2UgYXMgd2UgYWRkIG1vcmUgbGF5ZXJzLiAgCgpBbnl0aGluZyB0aGF0IGdvZXMgaW4gdGhlIGBnZ3Bsb3QoKWAgb2JqZWN0IGJlY29tZXMgYSBnbG9iYWwgc2V0dGluZy4gCkZyb20gdGhlcmUsIHdlIHVzZSB0aGUgYGdlb21gIG9iamVjdHMgdG8gYWRkIG1vcmUgbGF5ZXJzIHRvIHRoZSBiYXNlIGBnZ3Bsb3QoKWAgb2JqZWN0LiAKVGhlc2Ugd2lsbCBkZWZpbmUgd2hhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBpbGx1c3RyYXRpbmcgdXNpbmcgdGhlIGRhdGEuCgoqKioKPC9kZXRhaWxzPgoKRm9yIG1vcmUgb2YgYW4gaW50cm9kdWN0aW9uIG9uIGNyZWF0aW5nIHBsb3RzIHdpdGggYGdncGxvdDJgICwgc2VlIHRoaXMgW2Nhc2Ugc3R1ZHldKCkKCkZpcnN0LCB3ZSBzdGFydCB3aXRoIHRoZSBgZ2dwbG90KClgIGZ1bmN0aW9uIG9mIHRoZSBgZ2dwbG90MmAgcGFja2FnZS4KClRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB0aGUgYWVzdGhldGljcyBgYWVzKClgIGJlIHNwZWNpZmllZC4gVGhpcyBpbnZvbHZlcyBjaG9vc2luZyB3aGF0IHZhcmlhYmxlIHdpbGwgYmUgcGxvdHRlZCBvbiB0aGUgeC1heGlzIGFuZCB0aGUgeSBheGlzLiAKClRoaXMgd2lsbCBjcmVhdGUgYW4gZW1wdHkgcGxvdCBhcmVhLCBuZXh0IHdlIG5lZWQgdG8gdXNlIG9uZSBvZiB0aGUgYGdlb20qYCBmdW5jdGlvbnMgb2YgdGhlIGBnZ3Bsb3QyYCBwYWNrYWdlIHRvIHNwZWNpZnkgd2hhdCB0eXBlIG9mIHBsb3Qgd2Ugd2FudCB0byBjcmVhdGUuCgpUeXBlIGdlb20gaW50byB0aGUgUlN0dWRpbyBjb25zb2xlIGFuZCB5b3Ugd2lsbCBzZWUgbWFueSBvcHRpb25zIHRvIHNjcm9sbCB0aHJvdWdoLgoKV2Ugd2lsbCBiZSBjcmVhdGluZyBhIGBnZW9tX2NvbCgpYCBwbG90LCB3aGljaCBpcyBhIHBhcnRpY3VsYXIgdHlwZSBvZiBiYXIgcGxvdCB0aGF0IHVzZXMgdGhlIGFjdXRhbCB2YWx1ZXMgdG8gcGxvdCwgcmF0aGVyIHRoYW4gY291bnRzLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBvZiBgZ2VvbV9iYXIoKWAgV2Ugd2lsbCBzcGVjaWZ5IHdpdGggdGhlIGBmaWxsYCBhcmd1bWVudCwgdGhhdCB3ZSB3YW50IG91ciBiYXJzIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBjb2xvciBibGFjay4KCldlIHdpbGwgYWxzbyBtb2RpZnkgdGhlIHgtYXhpcyB1c2luZyB0aGUgYHNjYWxlX3hfY29udGludW91cygpYCBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgZm9yIHNwZWNpZmljYXRpb24gb2YgdGhlIHJhbmdlIG9yIGxpbWl0cyBvZiB0aGUgYXhpcyB1c2luZyB0aGUgYGxpbWl0c2AgYXJndW1lbnQuIFdlIGNhbiB1c2UgdGhlIGJhc2UgYHNlcSgpYCBmdW5jdGlvbiB0byBjcmVhdGUgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIGZvciBlYWNoIHRpY2sgbWFyay4KCgpXZSBjYW4gYWRkIGxhYmVscyB0byBvdXIgcGxvdCB1c2luZyB0aGUgYGxhYnMoKWAgZnVuY3Rpb24gb2YgYGdncGxvdDJgLiBUaGlzIGhhcyBhcmd1bWVudHMgc3VjaCBhcyBgeGAgYW5kIGB5YCBmb3IgdGhlIGF4ZXMgYW5kIGB0aXRsZWAgYW5kIGBzdWJ0aXRsZWAgZm9yIHRpdGxlcy4KCldlIHdpbGwgYWxzbyBtb2RpZnkgdGhlIG92ZXJhbGwgYWVzdGhldGljcyBvZiB0aGUgcGxvdCB1c2luZyBhIGB0aGVtZV8qYCBmdW5jdGlvbi4gU2VlIFtoZXJlXShodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvZ2d0aGVtZS5odG1sKSBmb3IgYSBsaXN0IG9mIG9wdGlvbnMuCgpgYGB7cn0Kc3RhcnQgPC0gMTk3MAplbmQgPC0gMjAyMAoKCnNob290aW5nc19wZXJfeWVhcl9wIDwtc2hvb3RpbmdzX3Blcl95ZWFyICU+JQogICAgZ2dwbG90KGFlcyh4ID0gRGF0ZV95ZWFyLCB5ID0gU2hvb3RpbmdzKSkgKwogICAgZ2VvbV9jb2woIGZpbGwgPSAiYmxhY2siKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKHN0YXJ0LCBlbmQsIGJ5ID0gNSksCiAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKHN0YXJ0LCBlbmQsIGJ5ID0gNSksCiAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhzdGFydC0xLCBlbmQrMSkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICAgIGxhYnModGl0bGUgPSAiWWVhcmx5IFNjaG9vbCBTaG9vdGluZ3MiLAoKICAgIyBsYWJzKHRpdGxlID0gIlllYXJseSBEZWF0aHMgQXR0cmlidXRhYmxlIHRvIFNjaG9vbCBTaG9vdGluZ3MiLAogICAgICAgICBzdWJ0aXRsZSA9ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgeCA9ICIiLAogICAgICAgICB5ID0gIlNjaG9vbCBTaG9vdGluZ3MiKQoKc2hvb3RpbmdzX3Blcl95ZWFyX3AgCmBgYAoKIyMjIFllYXJseSBEZWF0aHMKCk5vdGljZSB0aGF0IHdoZW4gdXNpbmcgc3VtbWFyaXplIHdlIGRvbnQgdXNlIG11dGF0ZSBoZXJlLgpgYGB7cn0KCmRlYXRoc19wZXJfeWVhcjwtc2hvb3RpbmdfZGF0YSAlPiUgCiAgZ3JvdXBfYnkoRGF0ZV95ZWFyKSAlPiUKICBzdW1tYXJpemUoRGVhdGhzID1zdW0oYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgKSkKCmRlYXRoc19wZXJfeWVhcl9wIDwtZGVhdGhzX3Blcl95ZWFyICU+JQogICAgZ2dwbG90KGFlcyh4ID0gRGF0ZV95ZWFyLCB5ID0gRGVhdGhzKSkgKwogICAgZ2VvbV9jb2woIGZpbGwgPSAiYmxhY2siKSsKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoc3RhcnQsIGVuZCwgYnkgPSA1KSwKICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoc3RhcnQsIGVuZCwgYnkgPSA1KSwKICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKHN0YXJ0LTEsIGVuZCsxKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgbGFicyh0aXRsZSA9ICJZZWFybHkgRGVhdGhzIEF0dHJpYnV0YWJsZSB0byBTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgc3VidGl0bGUgPSAiVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgIHkgPSAiU2Nob29sIFNob290aW5ncyIsCiAgICAgICAgIHggPSAiIikKZGVhdGhzX3Blcl95ZWFyX3AKCgoKCnBlcl95ZWFyPC1mdWxsX2pvaW4oc2hvb3RpbmdzX3Blcl95ZWFyLCBkZWF0aHNfcGVyX3llYXIpCnBlcl95ZWFyICU8PiVwaXZvdF9sb25nZXIoIGNvbHMgPSAoLURhdGVfeWVhciksIAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiZXZlbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImlkIikKCnBlcl95ZWFyJTw+JSAKICBtdXRhdGUoaWQgPSBmb3JjYXRzOjpmY3RfaW5vcmRlcihpZCkpCgpwZXJfeWVhciAlPiUKICAgIGdncGxvdChhZXMoeCA9IERhdGVfeWVhciwgeSA9IGV2ZW50cywgZmlsbCA9aWQpKSArCiAgICAjZ2VvbV9jb2woYWVzKGZpbGwgPSBpZCksIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fY29sKCkrCiAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKwogIGZhY2V0X2dyaWQofmlkKSsKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoc3RhcnQsIGVuZCwgYnkgPSA1KSwKICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoc3RhcnQsIGVuZCwgYnkgPSA1KSwKICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKHN0YXJ0LTEsIGVuZCsxKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgbGFicyh0aXRsZSA9ICJZZWFybHkgU2hvb3RpbmdzIGFuZCBEZWF0aHMgQXR0cmlidXRhYmxlIHRvIFNjaG9vbCBTaG9vdGluZ3MiLAogICAgICAgICBzdWJ0aXRsZSA9ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgeSA9ICJOdW1iZXIgb2YgZXZlbnRzIiwKICAgICAgICAgeCA9ICJZZWFyIikrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmxhY2siKSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCAKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9ZWxlbWVudF9yZWN0KGZpbGw9ImNvcm5mbG93ZXJibHVlIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAnd2hpdGUnLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKQogCgoKYGBgCgojIyMgWWVhcmx5IEN1bXVsYXRpdmUgU2hvb3RpbmdzCgpOb3cgbGV0J3MgbWFrZSBhbm90aGVyIHBsb3Qgb2YgdGhlIGN1bXVsYXRpdmUgZGVhdGhzIGVhY2ggeWVhciBpbmNsdWRpbmcgdGhvc2Ugb2YgdGhlIHByZXZpb3VzIHllYXJzLiBJbiB0aGlzIGNhc2Ugd2UgY2FuIHVzZSB0aGUgYHNob290aW5nX3Blcl95ZWFyYCBvYmplY3QgdGhhdCB3ZSBwcmV2aW91c2x5IG1hZGUuIFdlIHdhbnQgdG8gYWRkIGEgbmV3IHZhcmlhYmxlIHVzaW5nIHRoZSBgbXV0YXRlYCBmdW5jdGlvbiBjYWxsZWQgYG5fY3VtX3N1bWAgYnkgdXNpbmcgdGhlIGBjdW1zdW0oKWAgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGEgY3VtdWxhdGl2ZSBzdW0gYmFzZWQgb24gdGhlIHllYXJseSBjb3VudC4gCgphdm9jYWRvIGV4cGxhaW4gcGl2b3QgbG9uZ2VyCgpgYGB7cn0KCnNob290aW5nc19wZXJfeWVhcgoKc2hvb3RpbmdzX3Blcl95ZWFyX2N1bSA8LSBzaG9vdGluZ3NfcGVyX3llYXIlPiUKICAgIG11dGF0ZShTaG9vdGluZ3MgPSBjdW1zdW0oU2hvb3RpbmdzKSkKCnNob290aW5nc19wZXJfeWVhcl9jdW0gCgpkZWF0aHNfcGVyX3llYXJfY3VtIDwtIGRlYXRoc19wZXJfeWVhciU+JQogICAgbXV0YXRlKERlYXRocyA9IGN1bXN1bShEZWF0aHMpKQoKc2hvb3RpbmdzX3Blcl95ZWFyX2N1bSAKCgoKcGVyX3llYXJfY3VtIDwtIGZ1bGxfam9pbihzaG9vdGluZ3NfcGVyX3llYXJfY3VtLCBkZWF0aHNfcGVyX3llYXJfY3VtKQoKCnBlcl95ZWFyX2N1bSAlPD4lcGl2b3RfbG9uZ2VyKCBjb2xzID0gYyhTaG9vdGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWF0aHMgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJldmVudHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiaWQiKQoKcGVyX3llYXJfY3VtCmBgYAoKR29vZCwgdGhpcyBsb29rcyBsaWtlIHdlIHdvdWxkIGV4cGVjdC4KCk5vdyBsZXQncyBtYWtlIGEgcGxvdCBsaWtlIHdlIGRpZCBiZWZvcmU6CgpgYGB7cn0KcGVyX3llYXJfY3VtICU8PiUgCiAgbXV0YXRlKGlkID0gZm9yY2F0czo6ZmN0X2lub3JkZXIoaWQpKQoKcGVyX3llYXJfY3VtICU+JQogICAgZ2dwbG90KGFlcyh4ID0gRGF0ZV95ZWFyLCB5ID0gZXZlbnRzLCBmaWxsID1pZCkpICsKICAgICNnZW9tX2NvbChhZXMoZmlsbCA9IGlkKSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9jb2woKSsKICBmYWNldF9ncmlkKH5pZCkrCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKHN0YXJ0LCBlbmQsIGJ5ID0gNSksCiAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKHN0YXJ0LCBlbmQsIGJ5ID0gNSksCiAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhzdGFydC0xLCBlbmQrMSkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgIGxhYnModGl0bGUgPSAiQ3VtdWxhdGl2ZSBZZWFybHkgU2hvb3RpbmdzIGFuZCBEZWF0aHNcbkF0dHJpYnV0YWJsZSB0byBTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgc3VidGl0bGUgPSAiVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBudW1iZXIgb2YgZXZlbnRzIiwKICAgICAgICAgeCA9ICJZZWFyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIikpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPWVsZW1lbnRfcmVjdChmaWxsPSJjb3JuZmxvd2VyYmx1ZSIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gJ3doaXRlJywgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSkKIAoKYGBgCgpgYGB7cn0KCnNob290aW5nc19wZXJfeWVhcl9jdW0gJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBEYXRlX3llYXIsIHkgPSBTaG9vdGluZ3MpKSArCiAgICBnZW9tX2NvbChmaWxsID0gImJsYWNrIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoc3RhcnQtMSwgZW5kKzEpKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiWWVhcmx5IEN1bXVsYXRpdmUgTnVtYmVyIG9mIFNjaG9vbCBTaG9vdGluZ3MiLAojICAgIGxhYnModGl0bGUgPSAiWWVhcmx5IEN1bXVsYXRpdmUgRGVhdGhzIEF0dHJpYnV0YWJsZSB0byBTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgc3VidGl0bGUgPSAiVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgIHggPSAiU2Nob29sIFNob290aW5ncyIsCiAgICAgICAgIHkgPSAiIikKYGBgCgojIyMgRGVhdGhzIHBlciBTaG9vdGluZwoKTm93LCBsZXRzIG1ha2UgYSBwbG90IG9mIHRoZSBudW1iZXIgb2YgZGVhdGhzIHBlciBzaG9vdGluZyBiYXNlZCBvbiB0aGUgYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgIHZhcmFpYmxlLiBPdXIgZmlyc3QgcGxvdCBjb3VsZCBhbHNvIGhhdmUgYmVlbiBtYWRlIHVzaW5nIGBnZW9tX2JhcigpYCBpbnN0ZWFkIG9mIGBnZW9tX2NvbCgpYCB0aGlzIG1ha2VzIGEgc2ltaWxhciBwbG90IGJ1dCBhdXRvbWF0aWNhbGx5IHVzZXMgdGhlIGNvdW50IGZvciBvbmUgb2YgdGhlIGF4ZXMuIAoKYGBge3J9CiMgVGhpcyBpcyBlcXVpdmFsZW50OgojIGRlYXRoc19wZXJfZXZlbnQgPC0gc2hvb3RpbmdfZGF0YSAlPiUKIyAgICAgZ3JvdXBfYnkoYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgKSAlPiUKIyAgICAgY291bnQoKSAlPiUKIyAgICAgdW5ncm91cCgpCiMgCiMgZGVhdGhzX3Blcl9ldmVudCAlPiUKIyAgICAgZ2dwbG90KGFlcyh5ID0gYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgLCB4ID0gbikpICsKIyAgICAgZ2VvbV9jb2woZmlsbCA9ICJibGFjayIpKwojICAgICB0aGVtZV9taW5pbWFsKCkgKwojICAgICBsYWJzKHRpdGxlID0gIkRlYXRocyBwZXIgU2Nob29sIFNob290aW5nIiwKIyAgICAgICAgICBzdWJ0aXRsZSA9ICJVbml0ZWQgU3RhdGVzIiwKIyAgICAgICAgICB4ID0gIlNjaG9vbCBTaG9vdGluZ3MiLAojICAgICAgICAgIHkgPSAiIikKCnNob290aW5nX2RhdGEgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWApKSArCiAgICBnZW9tX2JhcihmaWxsID0gImJsYWNrIikgKwogICMgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDEwLCBieSA9IDEpLAogICMgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgwLDEwLCBieSA9IDEpLAogICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTApKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgbGFicyh0aXRsZSA9ICJEZWF0aHMgcGVyIFNjaG9vbCBTaG9vdGluZyIsCiAgICAgICAgIHN1YnRpdGxlID0gIlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICB4ID0gIlNjaG9vbCBTaG9vdGluZ3MiLAogICAgICAgICB5ID0gIiIpCgpgYGAKSXQgaXMgYSBiaXQgZGlmZmljdWx0IHRvIHNlZSB0aGUgc2hvb3RpbmdzIHRoYXQgaGFkIG1vcmUgbnVtZXJpb3VzIGRlYXRocywgc28gd2Ugd2lsbCBhZGQgYSBmYWNldCB0aGF0IHpvb21zIGluIG9uIHRoaXMgcG9ydGlvbiBvZiB0aGUgcGxvdC4gV2UgY2FuIGRvIHNvLCB1c2luZyB0aGUgYGZhY2V0X3pvb20oKWAgZnVuY3Rpb24gb2YgdGhlIGBnZ2ZvcmNlYCBwYWNrYWdlLgoKYGBge3J9CmxpYnJhcnkoZ2dmb3JjZSkKCgpzaG9vdGluZ19kYXRhICU+JQogICAgZ2dwbG90KGFlcyh4ID0gYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgKSkgKwogICAgZ2VvbV9iYXIoZmlsbCA9ICJibGFjayIpICsKICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCBtYXgocHVsbChzaG9vdGluZ19kYXRhLCBgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWApKSwgYnkgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgwLCBtYXgocHVsbChzaG9vdGluZ19kYXRhLCBgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWApKSwgYnkgPSAxKSkrCiAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMSwxMCkpICsKZ2dmb3JjZTo6ZmFjZXRfem9vbSh4bGltID0gYyg0LCBtYXgocHVsbChzaG9vdGluZ19kYXRhLCBgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWApKSksIHlsaW0gPSBjKDAsMjApKSsKdGhlbWVfbWluaW1hbCgpICsKICAgIGxhYnModGl0bGUgPSAiRGVhdGhzIHBlciBTY2hvb2wgU2hvb3RpbmciLAogICAgICAgICBzdWJ0aXRsZSA9ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgeCA9ICJEZWF0aHMgcGVyIHNob290aW5nIiwKICAgICAgICAgeSA9ICJOdW1iZXIgb2YgZXZlbnRzIHdpdGggZ2l2ZW4gbnVtYmVyIG9mIGRlYXRocyIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQpgYGAKClRoaXMgaXMgc3RpbGwgYSBiaXQgZGlmZmljdWx0IHRvIGludGVycHJldC4gTGV0J3MgdHJ5IHNvbWUgb3RoZXIgb3B0aW9ucy4KClRoZSBgZ2VvbV9mcmVxcG9seSgpYCBmdW5jdGlvbiBjcmVhdGVzIGEgZ3JhcGggdGhhdCBtYWtlcyBpdCB2ZXJ5IGVhc3kgdG8gc2VlIHRoYXQgbW9zdCBzaG9vdGluZ3MgcmVzdWx0IGluIHplcm8gb3Igb25lIGRlYXRoIGFuZCB0aGF0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBkZWF0aHMgaW4gdGhpcyBkYXRhIGZvciBhIHNpbmdsZSBldmVudCBpcyBpbiB0aGUgdXBwZXIgdHdlbnRpZXMuIApgYGB7cn0KCnNob290aW5nX2RhdGEgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWApKSArCiAgICBnZW9tX2ZyZXFwb2x5KCkKYGBgCgpUaGlzIHJlYWxseSBzaG93cyB0aGF0IG1vc3Qgc2hvb3RpbmcgZXZlbnRzIGx1Y2tpbHkgcmVzdWx0IGluIG5vIGRlYXRocywgYnV0IHdoYXQgYXJlIHRoZSBhY3R1YWwgcHJvcG9ydGlvbnMuIE9uZSB3YXkgdG8gbG9vayBhdCB0aGlzIGlzIHRvIGNhbHVjYXRlIHRoZSBwZXJjZW50YWdlIG9mIGV2ZW50cyB0aGF0IHJlc3VsdGVkIGluIGVhY2ggbnVtYmVyIG9mIGRlYXRocy4gCgpgYGB7cn0KZGVhdGhzX3BlcmNfZXZlbnQgPC1zaG9vdGluZ19kYXRhICU+JQogICBjb3VudChgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWApICU+JQogIHJlbmFtZSgibnVtX2V2ZW50cyI9IG4pICU+JQogICBtdXRhdGUocGVyY2VudCA9IChudW1fZXZlbnRzL3N1bShudW1fZXZlbnRzKSoxMDApKQoKZGVhdGhzX3BlcmNfZXZlbnQKCmRlYXRoc19wZXJjX2V2ZW50ICU+JQogIGdncGxvdChhZXMoeCA9YEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgICwgeSA9IHBlcmNlbnQpKSArCiAgICBnZW9tX2NvbCgpCmBgYAoKT2ssIHRoaXMgaXMgZWFzaWVyIHRvIGludGVycHJldCB0aGFuIHRoZSByYXcgY291bnQgdmFsdWVzLiBXZSBjYW4gc2VlIHRoYXQgZ3JlYXRlciB0aGFuIDYwJSBvZiB0aGUgZXZlbnRzIGhhZCBubyBkZWF0aHMuIEl0IGlzIGhvd2V2ZXIsIHN0aWxsIGEgYml0IGRpZmZpY3VsdCB0byBpbnRlcnByZXQuCgpTbyBub3csIHdlIHdpbGwgYWxzbyBjb2xsYXBzZSB0aGUgZXZlbnRzIHRoYXQgcmVzdWx0ZWQgaW4gNCBvciBtb3JlIGRlYXRocyB0b2dldGhlciBhbmQgd2Ugd2lsbCBjcmVhdGUgYSBwaWUgY2hhcnQgd2hpY2ggeW91IGFyZSBsaWtlbHkgZmFtaWxpYXIgd2l0aCBhcyB3ZWxsIGFzIGFsdGVybmF0aXZlIHBsb3QgY2FsbGVkIGEgd2FmZmxlIHBsb3QuCgoKRmlyc3QgdG8gY29sbGFwc2UgdGhlIHBlcmNlbnRhZ2UgZm9yIHRoZSBldmVudHMgdGhhdCBoYWQgNCBvciBtb3JlIGRlYXRocywgd2UgbmVlZCB0byBkbyBhIGJpdCBvZiB3cmFuZ2xpbmcuCgpXZSB3aWxsIHN0YXJ0IHdpdGggZmlsdGVyaW5nIHRoZSBkYXRhIHRvIG9ubHkgdGhlc2UgZXZlbnRzIGFuZCB0aGVuIHdlIHdpbGwgc3VtICBlYWNoIG9mIHRoZSBjb2x1bW5zIHVzaW5nIHRoZSBiYXNlIGBjb2xTdW1zKClgIGZ1bmN0aW9uIHdpdGggdGhlIGdvYWwgb2YgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBgZGVhdGhzX3BlcmNfZXZlbnRgIG9iamVjdCB0aGF0IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZXZlbnRzIHdpdGggNCBvciBtb3JlIGRlYXRocy4KCmBgYHtyfQpncmVhdGVyX3RoYW40PC1kZWF0aHNfcGVyY19ldmVudCAlPiUgCiAgZmlsdGVyKGBLaWxsZWQgKGluY2x1ZGVzIHNob290ZXIpYCA+PSA0KSAlPiUgCiAgY29sU3VtcygpCgpncmVhdGVyX3RoYW40CgpgYGAKR29vZCwgbm93IHdlIGtub3cgdGhlIG92ZXJhbGwgcGVyY2VudGFnZSBmb3IgdGhlIGV2ZW50cyB0aGF0IHVuZm9ydW50YXRlbHkgcmVzdWx0ZWQgaW4gYSBsYXJnZXIgbnVtYmVyIG9mIGRlYXRocy4gCgpOb3cgd2UgY2FuIGNvbWJpbmUgdGhpcyB3aXRoIHRoZSByZXN0IG9mIG91ciBkYXRhIHVzaW5nIHRoZSBgYmluZF9yb3dzKClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UuCgpgYGB7cn0KZGVhdGhzX3BlcmNfZXZlbnQgJTw+JSAgYmluZF9yb3dzKGdyZWF0ZXJfdGhhbjQpCgpkZWF0aHNfcGVyY19ldmVudCAKYGBgCgpOb3cgd2Ugd2FudCB0byBhZGQgYSBuZXcgdmFyaWFibGUgc28gdGhhdCBpdCBpcyBlYXN5IHRvIHBsb3QgYW5kIGludGVycGV0IHRoZSBudW1iZXIgb2YgZGVhdGhzIGZvciBlYWNoIHBlcmNlbnRhZ2UuIFdlIHdpbGwgc2ltcGx5IGFkZCB0aGUgd29yZCAiZGVhdGhzIiB0byBlYWNoIHZhbHVlIGluIHRoZSBgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWAgdmFyaWFibGUgdXNpbmcgdGhlIGJhc2UgYHBhc3RlKClgIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IHdpbGwgcmVzdWx0IGluIGEgc3BhY2UgYmV0d2VlbiBwYXN0ZWQgZWxlbWVudHMuIElmIHlvdSBkaWRudCB3YW50IGEgc3BhY2UgeW91IGNvdWxkIHNwZWNpZnkgZm9yIGV4YW1wbGUgYW4gdW5kZXJzY29yZSB1c2luZyB0aGUgYHNlcGAgYXJndW1lbnQuIAoKYGBge3J9CmRlYXRoc19wZXJjX2V2ZW50ICU8PiUgbXV0YXRlKGNhdGVnb3J5ID0gcGFzdGUoYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgLCAiZGVhdGhzIikpIAoKZGVhdGhzX3BlcmNfZXZlbnQKYGBgCgpXZSB3b3VsZCBsaWtlIHRvIGNoYW5nZSB0aGUgdmFsdWUgZm9yIHRoZSBsYXN0IHJvdyBhYm91dCB0aGUgZXZlbnRzIHRoYXQgcmVzdWx0ZWQgaW4gNCsgZGVhdGhzLiAKCldlIGNhbiB1c2UgdGhlIGBsYXN0KClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UgY29tYmluZWQgd2l0aCB0aGUgYHB1bGwoKWAgZnVuY3Rpb24gdG8gc3BlY2lmaWNhbGx5IGdyYWIgdGhpcyB2YWx1ZS4KCmBgYHtyfQpsYXN0KHB1bGwoZGVhdGhzX3BlcmNfZXZlbnQsIGNhdGVnb3J5KSkKCmBgYAoKCk5vdyB3ZSBjYW4gdXNlIHRoZSBgY2FzZV93aGVuKClgIGZ1bmN0aW9uIHlldCBhZ2FpbiB0byBjaGFuZ2UgdGhpcyB2YWx1ZS4gTm90ZSB0aGF0IHdlIGNvdWxkIGhhdmUgdXNlZCBhIHN0cmluZ3IgZnVuY3Rpb24gdG8gcmVwbGFjZSB0aGUgc3BlY2lmaWMgdmFsdWUgb2YgIjg1IGRlYXRocyIsIGJ1dCB0aGlzIHdvdWxkIG5vdCBiZSByZXByb2R1Y2libGUuIFNheSB3ZSB1c2VkIHRoaXMgY29kZSBhZ2FpbiBhZnRlciB0aGUgZGF0YSBnb3QgdXBkYXRlZC4gVGhlbiB0aGVyZSBtYXkgYmUgbW9yZSBkZWF0aHMgaW4gdGhpcyBjYXRlZ29yeSBhbmQgdGhlcmVmb3JlIHRoaXMgdmFsdWUgd291bGQgbm8gbG9uZ2VyIGJlICI4NSBkZWF0aHMiLiBJbnN0ZWFkLCBieSB1c2luZyBgY2FzZV93aGVuKClgLCB3ZSBjYW4gdXNlIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSBgZGVhdGhzX3BlcmNfZXZlbnRgIHRpYmJsZSBhbmQgcmVwbGFjZSB0aGF0LCByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIHZhbHVlIGlzLCB3aXRoICI0K2RlYXRocyIuIFJlY2FsbCB0aGF0IGBjYXNlX3doZW4oKWAgcmVwbGFjZXMgYWxsIG90aGVyIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkIHdpdGggYE5BYC4gV2UgZG8gbm90IHdhbnQgdG8gbG9zZSB0aGUgb3RoZXIgdmFsdWVzIGZvciB0aGUgYGNhdGVnb3J5YCB2YXJpYWJsZS4gU28gdG8gYXZvaWQgdGhpcywgd2UgIGFzc2lnbiBlYWNoIG9mIHRoZSB2YWx1ZXMgdGhhdCBhcmUgbm90IHRoZSBsYXN0IHZhbHVlIHRvIHdoYXQgdGhleSBjdXJyZW50bHkgYXJlIGZvciB0aGUgYGNhdGVnb3J5YCB2YXJpYWJsZSwgdXNpbmcgYFRSVUUgfiBjYXRlZ29yeWAuCgpgYGB7cn0KZGVhdGhzX3BlcmNfZXZlbnQgJTw+JSAKICBtdXRhdGUoY2F0ZWdvcnkgPSBjYXNlX3doZW4oCiAgICBjYXRlZ29yeSA9PSAgbGFzdChwdWxsKGRlYXRoc19wZXJjX2V2ZW50LCBjYXRlZ29yeSkpIH4gIjQrIGRlYXRocyIsCiAgICBjYXRlZ29yeSA9PSAiMSBkZWF0aHMiIH4gIjEgZGVhdGgiLAogICAgVFJVRSB+IGNhdGVnb3J5KSkKCmRlYXRoc19wZXJjX2V2ZW50CmBgYAoKTG9va3MgYXMgd2UgaG9wZWQuIE9rLCBub3cgd2UgYXJlIHJlYWR5IHRvIG1ha2UgbW9yZSBwbG90cy4gCgpGaXJzdCB3ZSB3aWxsIHN0YXJ0IHdpdGggdGhlIHBpZSBjaGFydC4gVGhpcyBpcyBhIGJpdCBvZiBhIGNvbnRyb3ZlcnNpYWwgdHlwZSBvZiBwbG90LiBIb3dldmVyLCBpdCBjYW4gYmUgdmVyeSB1c2VmdWwgd2hlbiB5b3UgYXJlIGFjdHVhbGx5IGxvb2tpbmcgYXQgcGVyY2VudGFnZXMgYW5kIHRoZSBnb2FsIGlzIHRvIHNlZSBtYWpvciB0cmVuZHMgaW4gdGhlIGRhdGEsIHN1Y2ggYXMgYWxsIHRoZSBncm91cHMgYXJlIHJvdWdobHkgZXF1YWwgb3Igb25lIGdyb3VwIGlzIHBhcnRpY3VsYXJseSBsYXJnZXIgdGhhbiB0aGUgcmVzdC4gV2hlbiB0aGlzIGlzIHRoZSBjYXNlIGFuZCB5b3UgYXJlIHByZXNlbnRpbmcgdGhlIGRhdGEgdG8gYW4gYXVkaWFuY2UgdGhhdCBpcyBsZXNzIGZhbWlsaWFyIHdpdGggZGF0YSBzY2llbmNlLCB0aGV5IG1heSBleHBlY3QgdG8gc2VlIGEgcGllIGNoYXJ0LiBUaHVzIGl0IGlzIHVzZWZ1bCB0byBrbm93IGhvdyB0byBtYWtlIG9uZS4gSG93ZXZlciwgaW4gbW9zdCBvdGhlciBjYXNlcyBwaWUgY2hhcnRzIGRvIGEgcG9vciBqb2IgYXQgYWxsb3dpbmcgdXMgdG8gc2VlIG1vcmUgc3VidGxlIGRpZmZlcmVuY2VzLCBhbmQgdGhleSBhcmUgcGFydGljdWxhcmx5IGNvbmZ1c2luZyB3aGVuIHdlIGFyZSBub3QgbG9va2luZyBhdCBwcm9wb3J0aW9ucyBidXQgcmF3IGNvdW50cy4gSW4gdGhvc2UgY2FzZXMgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIGJhciBjaGFydCBhcyB3ZSBoYXZlIGFscmVhZHkgZG9uZS4gCgpUaGVyZSBpcyBubyBgZ2VvbV8qYCBmdW5jdGlvbiB0aGF0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgcGllIGNoYXJ0IGRpcmVjdGx5LiBJbnN0ZWFkIHdlIHdpbGwgY3JlYXRlIG91ciBiYXIgcGxvdCBhcyB3ZSBoYXZlIGFuZCB0aGVuIHVzZSB0aGUgYGNvb3JkX3BvbGFyKClgIGZ1bmN0aW9uIHRvIHdyYXAgb3VyIHkgYXhpcyBpbnRvIGEgY2lyY3VsYXIgc2hhcGUuCgpgYGB7cn0KZGVhdGhzX3BlcmNfZXZlbnQgJT4lCiAgZmlsdGVyKHBlcmNlbnQ+MC41KSAlPiUKICAgIGdncGxvdChhZXMoeCA9ICIiLCB5ID0gcGVyY2VudCwgZmlsbCA9IGNhdGVnb3J5KSkgKwogICMgYWRkaW5nIGNvbG9yIGhlcmUgYWRkcyBhIGJsYWNrIG91dGxpbmUKICAgIGdlb21fY29sKGNvbG9yID0gImJsYWNrIikgKwogICAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPSBOVUxMKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSsKICBsYWJzKHRpdGxlID0gIlBlcmNlbnRhZ2VzIG9mIHNjaG9vbCBzaG9vdGluZyBkZWF0aHNcbihpbmNsdWRpbmcgdGhlIHNob290ZXIpIikKCmBgYAoKVGhpcyBpcyBhY3R1YWxseSBhIGZhaXJseSBlYXN5IHBsb3QgdG8gaW50ZXJwcmV0LiBXZSBjYW4gc2VlIHRoYXQgbW9zdCBldmVudHMgcmVzdWx0ZWQgaW4gemVybyBkZWF0aHMgYW5kIHRoYXQgdGhlIG5leHQgbGFyZ2VzdCBwcm9wb3J0aW9uIHJlc3VsdGVkIGluIG9uZSBkZWF0aCwgd2hpbGUgYSBzaXphYmxlIGJ1dCBzbWFsbCBwcm9wb3J0aW9uIHJlc3VsdGVkIGluIHR3byBkZWF0aHMuIEEgdmVyeSBzbWFsbCBwcm9wb3J0aW9uIHJlc3VsdGVkIGluIHRocmVlIG9yIGZvdXIgb3IgbW9yZSBkZWF0aHMuCgpOb3cgd2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIHdhZmZsZSBwbG90LiBUaGlzIHBsb3Qgb2ZmZXJzIG9uZSBhZHZhbnRhZ2Ugb3ZlciB0aGUgcGllIGNoYXJ0LCBpbiB0aGF0IGl0IGFsc28gYWxsb3dzIGZvciBlYXNpZXIgaW50ZXJwcmV0YXRpb24gb2YgbW9yZSBzdWJ0bGUgcHJvcG9ydGlvbiBkaWZmZXJlbmNlcyB3aGlsZSBhbHNvIHNob3dpbmcgYmlnIHBpY3R1cmUgZGlmZmVyZW5jZXMgaW4gZWZmaWNlbnQgbWFubmVyLiAKClRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSBpbiB3aWRlIGZvcm1hdC4gVGh1cyB3ZSBuZWVkIHRvIHVzZSBgcGl2b3Rfd2lkZXIoKWAgb2YgdGhlIGB0aWR5cmAgcGFja2FnZSB0byBkbyBzby4KCmBgYHtyfQpsaWJyYXJ5KHdhZmZsZSkKCmRlYXRoc19wZXJjX2V2ZW50ICU+JSBzZWxlY3QoLWBLaWxsZWQgKGluY2x1ZGVzIHNob290ZXIpYCkgJT4lCiAgZmlsdGVyKGNhdGVnb3J5ICVpbiUgYygiMCBkZWF0aHMiLCAiMSBkZWF0aCIsICIyIGRlYXRocyIsICIzIGRlYXRocyIsICI0KyBkZWF0aHMiKSkgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChwZXJjZW50KSkgJT4lCiAgc2VsZWN0KC1udW1fZXZlbnRzKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGNhdGVnb3J5LCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHBlcmNlbnQpICU+JQogIHdhZmZsZTo6d2FmZmxlKGxlZ2VuZF9wb3MgPSAiYm90dG9tIikgKyAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKQogIAoKI2NvbG9ycyA9IGMoImdyZXk1NCIsICJibGFjayIsICJyZWQiLCJncmV5NzciLCAiIzAwOWJkYSIgKSwKCgpgYGAKCiMjICoqRGFzaGJvYXJkIEJhc2ljcyoqCioqKgoKT0ssIG5vdyB3ZSBoYXZlIG91ciBkYXRhIGFuZCBvdXIgcGxvdHMgZm9yIG91ciBkYXNoYm9hcmQhCgpOb3cgd2Ugd2lsbCBpbnRyb2R1Y2Ugc29tZSBiYXNpY3MgYWJvdXQgY3JlYXRpbmcgZGFzaGJvYXJkcyBpbiBSIHdpdGggdGhlIGBmbGV4ZGFzaGJvYXJkYCBwYWNrYWdlLgoKCiMjIyBEYXNoYm9hcmQgcGFja2FnZXMKVG8gbWFrZSBvdXIgZGFzaGJvYXJkIHdlIHdpbGwgdXNlIHRocmVlIHZlcnkgdXNlZnVsIHBhY2thZ2VzOgoKMSkgW2ZsZXhkYXNoYm9hcmRdKGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL2ZsZXhkYXNoYm9hcmQvKQoKRmxleGRhc2hib2FyZCBpcyBhIHBhY2thZ2UgdGhhdCB3YXMgY3JlYXRlZCBieSBSU3R1ZGlvIGFuZCBbcmVsZWFzZWRdKGh0dHBzOi8vYmxvZy5yc3R1ZGlvLmNvbS8yMDE2LzA1LzE3L2ZsZXhkYXNoYm9hcmQtZWFzeS1pbnRlcmFjdGl2ZS1kYXNoYm9hcmRzLWZvci1yLykgaW4gTWF5IG9mIDIwMTYuIFRoaXMgcGFja2FnZSBhbGxvd3MgZm9yIHVzZXJzIHRvIG1vcmUgZWFzaWx5IGNyZWF0ZSBkYXNoYm9hcmRzIHVzaW5nIFtSIG1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tLykuIAoKU2VlIFtoZXJlXShodHRwczovL3JzdHVkaW8uY29tL3Jlc291cmNlcy93ZWJpbmFycy9pbnRyb2R1Y2luZy1mbGV4ZGFzaGJvYXJkcy8pIGZvciBhIHZpZGVvIGFib3V0IGZsZXhkYXNoYm9hcmQgYW5kIFtoZXJlXShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9mbGV4ZGFzaGJvYXJkLykgZm9yIGEgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoaXMgcGFja2FnZS4KCjIpIFtsZWFmbGV0XShodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2xlYWZsZXQvKQoKW0xlYWZsZXRdKGh0dHBzOi8vbGVhZmxldGpzLmNvbS8pIGlzIHRoZSBsZWFkaW5nIG9wZW4tc291cmNlIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcyBhbmQgaXMgdXNlZCBieSBtYW55IHdlYnNpdGVzLiBUaGUgW2xlYWZsZXRdKGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vbGVhZmxldC8pIFIgcGFja2FnZSBhbGxvd3MgZm9yIHVzZXJzIHRvIG1vcmUgZWFzaWx5IGludGVncmF0ZSBsZWFmbGV0IG1hcHMgaW4gUiwgdG8gY3JlYXRlIG1hcHMgbGlrZSB0aGUgb25lIGJlbG93LiBXZSB3aWxsIHVzZSB0aGlzIHBhY2thZ2UgdG8gY3JlYXRlIGEgbWFwIG9mIHdoZXJlIHNjaG9vbCBzaG9vdGluZ3MgaGF2ZSBvY2N1cmVkIGluIHRoZSBVUy4KCmBgYHtyLGVjaG89RkFMU0V9CmxpYnJhcnkobWFwcykKbWFwU3RhdGVzID0gbWFwKCJzdGF0ZSIsIGZpbGwgPSBUUlVFLCBwbG90ID0gRkFMU0UpCmxlYWZsZXQoZGF0YSA9IG1hcFN0YXRlcykgJT4lIGFkZFRpbGVzKCkgJT4lCiAgYWRkUG9seWdvbnMoZmlsbENvbG9yID0gdG9wby5jb2xvcnMoMTAsIGFscGhhID0gTlVMTCksIHN0cm9rZSA9IEZBTFNFKQpgYGAKCgozKSBbc2hpbnldKGh0dHBzOi8vc2hpbnkucnN0dWRpby5jb20vKQoKW1NoaW55XShodHRwczovL3NoaW55LnJzdHVkaW8uY29tLykgaXMgYW4gUiBwYWNrYWdlIHRoYXQgbWFrZXMgaXQgZWFzaWVyIHRvIGNyZWF0ZSBpbnRlcmFjdGl2ZSB3ZWIgYXBwbGljYXRpb25zIGluIFIuIFNlZSBbaGVyZV0oaHR0cHM6Ly9zaGlueS5yc3R1ZGlvLmNvbS9nYWxsZXJ5LykgZm9yIGEgZ2FsbGVyeSBvZiBleGFtcGxlcy4gUGVvcGxlIGhhdmUgY3JlYXRlZCBhIHZhcmlldHkgb2YgZGl2ZXJzZSBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBwYWNrYWdlLSBmcm9tIFtpbnRlcmFjdGl2ZSB3ZWJzaXRlc10oaHR0cHM6Ly9zaGlueS5yc3R1ZGlvLmNvbS9nYWxsZXJ5L3JlYWwtZXN0YXRlLWludmVzdG1lbnQuaHRtbCkgdG8gW2dhbWVzXShodHRwczovL3NoaW55LnJzdHVkaW8uY29tL2dhbGxlcnkvaGV4LW1lbW9yeS5odG1sKS4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0gIjYwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJnYW1lLnBuZyIpKQpgYGAKCiMjIyMjIFtbc291cmNlXV0oaHR0cHM6Ly9zaGlueS5yc3R1ZGlvLmNvbS9nYWxsZXJ5L2hleC1tZW1vcnkuaHRtbCkKClNlZSBbaGVyZV0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vZmxleGRhc2hib2FyZC91c2luZy5odG1sI2NvbXBvbmVudHMpIGZvciBhIGxpc3Qgb2Ygb3RoZXIgcGFja2FnZXMgdGhhdCBhcmUgdXNlZnVsIGZvciBhZGRpbmcgZWxlbWVudHMgdG8gZGFzaGJvYXJkcyBjcmVhdGVkIHdpdGggdGhlIGBmbGV4ZGFzaGJvYXJkYCBwYWNrYWdlLgoKKioqCgojIyMgUiBNYXJrZG93bgoKVGhlIGNhc2Ugc3R1ZHkgdGhhdCB5b3UgYXJlIHJlYWRpbmcgcmlnaHQgbm93IHdhcyBjcmVhdGVkIHVzaW5nIGFuIFtSIE1hcmtkb3duIGRvY3VtZW50XShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS8pLiBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgYSBkb2N1bWVudCB0aGF0IHVzZXMgdGhlIGBNYXJrZG93bmAgbGFuZ3VhZ2Ugc3ludGF4LiAKCkluIGZhY3QgaWYgeW91IGNsaWNrIHRoZSBidXR0b24gdGhhdCBzYXlzICJjb2RlIiBvbiB0aGUgdXBwZXIgcmlnaHQgY29ybmVyIHlvdSB3aWxsIGRvd25sb2FkIHRoZSBbUiBNYXJrZG93bl0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vYXJ0aWNsZXNfaW50cm8uaHRtbCM6fjp0ZXh0PVIlMjBNYXJrZG93biUyMGlzJTIwYSUyMGZpbGUsY29kZSUyQyUyMGxpa2UlMjB0aGUlMjBkb2N1bWVudCUyMGJlbG93LikgZG9jdW1lbnQgZm9yIHRoaXMgY2FzZSBzdHVkeS4gCgpbUiBNYXJrZG93biAoUm1kKV0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vYXJ0aWNsZXNfaW50cm8uaHRtbCM6fjp0ZXh0PVIlMjBNYXJrZG93biUyMGlzJTIwYSUyMGZpbGUsY29kZSUyQyUyMGxpa2UlMjB0aGUlMjBkb2N1bWVudCUyMGJlbG93LikgaXMgYSBmaWxlIGZvcm1hdCB0aGF0IGNvbnRhaW5zIE1hcmtkb3duIHN5dGF4IGFuZCBlbWJlZGRlZCBSIGNvZGUgKGl0IGNhbiBhbHNvIGluY29wZXJhdGUgY29kZSBmcm9tIHNvbWUgb3RoZXIgbGFuZ3VhZ2VzIGxpa2UgW1B5dGhvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHl0aG9uXyhwcm9ncmFtbWluZ19sYW5ndWFnZSkpIGFuZCBbU1FMXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUUwpKS4KCgoKCmBgYHtyfQpsaWJyYXJ5KCJ2ZW1iZWRyIikKZW1iZWRfdXJsKCJodHRwczovL3ZpbWVvLmNvbS8xNzg0ODU0MTYiKSAlPiUKICBkaXYoY2xhc3MgPSAidmVtYmVkciIpICU+JQogIGRpdihhbGlnbiA9ICJjZW50ZXIiKQpgYGAKCiMjIyMjIFtbc291cmNlXV0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vbGVzc29uLTEuaHRtbCkgCgpUaGVzZSBSbWQgZmlsZXMgYXJlIHJlbmRlcmVkIGludG8gYSB2YXJpZXR5IG9mIGZpbGUgb3V0cHV0cyBsaWtlIFBERiwgd29yZCwgSFRNTCBldGMuIGJ5IHRoZSAgW2Brbml0cmBdKGh0dHBzOi8veWlodWkub3JnL2tuaXRyLykgYW5kIFtgcm1hcmtkb3duYF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3JtYXJrZG93bi9ybWFya2Rvd24ucGRmKSBwYWNrYWdlcy4KClRoaXMgcmVsaWVzIG9uIGNvbnZlcnNpb24gb2YgdGhlIFJtZCBmaWxlIGludG8gdGhlIFtNYXJrZG93bl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFya2Rvd24pIGxhbmd1YWdlIGJ5IHNvZnR3YXJlIGNhbGxlZCBbUGFuZG9jXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYW5kb2MpLgoKW01hcmtkb3duXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXJrZG93bikgKHdoaWNoIGhhcyBiZWVuIGltcGxlbWVudGVkIGJ5IG1hbnkgbGFuZ3VhZ2VzLCBzdWNoIGFzIFtQZXJsXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QZXJsKSwgW0phdmFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phdmFfKHByb2dyYW1taW5nX2xhbmd1YWdlKSksIFtQeXRob25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1B5dGhvbl8ocHJvZ3JhbW1pbmdfbGFuZ3VhZ2UpKSwgW0MjXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DX1NoYXJwXyhwcm9ncmFtbWluZ19sYW5ndWFnZSkpLCBbUnVieV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUnVieV8ocHJvZ3JhbW1pbmdfbGFuZ3VhZ2UpKSwgZXRjLikgaXMgYSBsYW5ndWFnZSBvZiBhIHBhcnRpY3VsYXIgY2xhc3Mgb2YgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGNhbGxlZCBbbGlnaHR3ZWlnaHQgbWFya3VwIGxhbmd1YWdlcyhMTUwpXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaWdodHdlaWdodF9tYXJrdXBfbGFuZ3VhZ2UpLiAKCkxNTHMgaGF2ZSByZWxhdGl2ZWx5IHNpbXBsZSBhbmQgaW50dWF0aXZlIHN5bnRheCwgYW5kIGFyZSB0aGVyZWZvcmUgcmVsYXRpdmVseSBlYXN5IHRvIHdyaXRlIGFuZCByZWFkIGFuZCBhcmUgY29udmVydGVkIGJ5IHNvZnR3YXJlIGludG8gc29tZSB0eXBlIG9mIGxlc3MgaHVtYW4tZnJlaW5kbHkgbGFuZ3VhZ2UgdG8gY3JlYXRlIGFuIG91cHV0IGRvY3VtZW50IGxpa2UgYSBQREYgb3IgYW4gSFRNTCBmaWxlLiAgSW4gZmFjdCwgbXVsdGlwbGUgb3V0cHV0IGZpbGVzIGNhbiBiZSBjcmVhdGVkIGZyb20gdGhlIHNhbWUgTE1MIGZpbGUhCgpJbiBvdXIgY2FzZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiByZW5kZXJpbmcgb3VyIFJtZCBkb2N1bWVudCBpbnRvIGEgd2Vic2l0ZS4gVGh1cyB0aGUgY29kZSBpbiBvdXIgUiBNYXJrZG93biBkb2N1bWVudCB3aWxsIGJlIGludGVycHJldGVkIGFuZCBjb252ZXJ0ZWQgdWx0aW1hdGVseSBpbnRvIGh0bWwgY29kZS4KCkFsdGhvdWdoIExNTHMgdGVuZCB0byBiZSBxdWl0ZSBzaW1pbGFyLCBoZXJlIHlvdSBjYW4gc2VlIHNvbWUgb2YgdGhlIGRpZmZlcmVuY2VzIGluIHN5bnRheDoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJzeW50YXgucG5nIikpCmBgYAoKIyMjIyMgW1tzb3VyY2VdXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaWdodHdlaWdodF9tYXJrdXBfbGFuZ3VhZ2UpCgpTZWUgdGhpcyBbYm9va10oaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLykgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gd29ya2luZyB3aXRoIFIgTWFya2Rvd24gZmlsZXMuIAoKVGhlIFJTdHVkaW8gW2NoZWF0c2hlZXQgZm9yIFIgTWFya2Rvd25dKGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL2NoZWF0c2hlZXRzL3Jhdy9tYXN0ZXIvcm1hcmtkb3duLTIuMC5wZGYpIGFuZCB0aGlzIFt0dXRvcmlhbF0oaHR0cHM6Ly9vdXJjb2RpbmdjbHViLmdpdGh1Yi5pby90dXRvcmlhbHMvcm1hcmtkb3duLykgYXJlIGdyZWF0IGZvciBnZXR0aW5nIHN0YXJ0ZWQuIAoKYXZvY2Fkby0gaG93IGRvIHlvdSBmZWVsIGFib3V0IGluY2x1ZGluZyB0aGlzIHR1dG9yaWFsIC0gaXQgaXMgdmVyeSBnb29kIC0gYW5kIG5vdCBjb2RlIGFjYWRlbXktIGJ1dCBJIGFtIG5vdCBmYW1pbGlhciB3aXRoIHRoZSBjb2RpbmcgY2x1YiBidXQgdGhleSBzZWVtIGxpa2UgYSBuaWNlIGdyb3VwIAoKCiMjIyBGbGV4ZGFzaGJvYXJkCgoKVGhlcmUgYXJlIHNldmVyYWwgaW1wb3J0YW50IGZlYXR1cmVzIGFib3V0IHRoZSBSIG1hcmtkb3duIHRoYXQgdGhlIGBmbGV4ZGFzaGJvYXJkYCBwYWNrYWdlIHV0aWxpemVzLiAKClRoZXNlIGFyZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxheW91dCBhbmQgZWxlbWVudHMgb2YgdGhlIGRhc2hib2FyZC4KCkhlcmUgYXJlIHNvbWUgbWFqb3IgUiBtYXJrZG93biBmZWF0dXJlcyB0byBrZWVwIGluIG1pbmQgZm9yIGBmbGV4ZGFzaGJvYXJkYAoKMSkgVGhlIGJlZ2lubmluZyBvZiBhbiBSIG1hcmtkb3duIGRvY3VtZW50IGlzIHdoYXQgaXMgY2FsbGVkIHRoZSBbWUFNTF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWUFNTCkgaGVhZGVyLiBUaGlzIGlzIGRlbGluYXRlZCBieSBgLS0tYCB0aHJlZSBkYXNobWFya3MgYmVmb3JlIGFuZCBhZnRlciB0aGUgaGVhZGVyIFlBTUwgY29kZS4KCkxpa2Ugc286CmBgYHtyLCBlY2hvID0gRkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJ5YW1sLnBuZyIpKQpgYGAKCiMjIyMjIFtbc291cmNlXV0oaHR0cHM6Ly9vdXJjb2RpbmdjbHViLmdpdGh1Yi5pby90dXRvcmlhbHMvcm1hcmtkb3duLykKCltZQU1MXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQU1MKSBpcyB5ZXQgYW5vdGhlciBsYW5ndWFnZSwgYnV0IHVubGlrZSBNYXJrZG93biBpdCBpcyBhIGRhdGEtb3JpZW50ZWQgbGFuZ3VhZ2UgYW5kIGlzIG9mdGVuIHVzZWQgZm9yIHRoZSBbY29uZmlndXJhdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uZmlndXJhdGlvbl9maWxlKSBvZiBzb2Z0d2FyZSBvciB0byBzZXQgdXAgaG93IGEgc29mdHdhcmUgcHJvZ3JhbSBzaG91bGQgd29yay4KClRodXMgd2hhdGV2ZXIgY29kZSB5b3UgcHV0IGluIHRoZSBZQU1MIGhlYWRlciB3aWxsIGluY2x1ZnVlbmNlIHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudCBhbmQgZXNzZW50aWFsbHkgc2V0IHVwIGhvdyB0aGUgUiBtYXJrZG93biBkb2N1bWVudCB3aWxsIHJlbmRlci4gSW4gdGhlIGV4YW1wbGUgdGhlIHR5cGUgb2Ygb3V0cHV0IGlzIHNwZWNpZmllZC4KCkJ1dCBvdGhlciBtb3JlIGNvbXBsaWNhdGVkIGZlYXR1cmVzIGNhbiBiZSBpbmNsdWRlZC4gRm9yIGV4YW1wbGUsIHdlIGNhbiBzcGVjaWZ5IHRoYXQgd2UgYXJlIGNyZWF0aW5nIGEgZGFzaGJvYXJkIHdpdGggZmxleGRhc2hib2FyZCBhbmQgd2UgY2FuIHNwZWNpZnkgaG93IHdlIHdhbnQgdGhlIGxheW91dCBvZiBvdXIgZGFzaGJvYXJkIHRvIGJlIGRpc3BsYXllZCBsaWtlIHNvOgoKYGBge3IsIGVjaG8gPSBGQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInlhbWxfZGFzaGJvYXJkLnBuZyIpKQpgYGAKCiMjIyMjIFtbc291cmNlXV0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vZmxleGRhc2hib2FyZC9sYXlvdXRzLmh0bWwpCgpXZSB3aWxsIGRlc2NyaWJlIHRoaXMgaW4gbW9yZSBkZXRhaWwgc29vbi4KCjIpIENvbXBvbmVudHMgd2l0aGluIHRoZSBkYXNoYm9hcmQgYXJlIGRlbGluYXRlZCBieSB1c2luZyBgIyMjYCAtIGlmIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCBtYXJrZG93biBub3RhdGlvbiwgdGhpcyBpcyBhIGxldmVsIDMgbWFya2Rvd24gaGVhZGVyLgoKSWYgdGhpcyBpbmNsdWRlcyB0ZXh0IGxpa2Ugc286IGAjIyMgdGV4dGAsIHRoaXMgYWRkcyBoZWFkZXIgdGV4dCB0byB0aGUgY29tcG9uZW50LCBob3dldmVyIHRoaXMgaXMgbm90IHJlcXVpcmVkLiAKCgozKSBUbyAgaW5jbHVkZSBhIHBsb3Qgb3IgYW55IG91dHB1dCBmcm9tIFIsIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKYCJgYGB7cn0iYCBvbiBpdCdzIG93biBsaW5lIGZvbGxvd2VkIGJ5IHlvdXIgY29kZSwgZm9sbG93ZWQgYnkgYCJgYGAiYC4gVGhpcyBjcmVhdGVzIHdoYXQgaXMgY2FsbGVkIGEgY29kZSBjaHVuay4KCmBgYHtyLCBlY2hvID0gRkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJjb2RlX2NodW5rLnBuZyIpKQpgYGAKCiMjIyMjIFtbc291cmNlXV0oaHR0cHM6Ly9vdXJjb2RpbmdjbHViLmdpdGh1Yi5pby90dXRvcmlhbHMvcm1hcmtkb3duLykKCjQpIFRvIGFkZCBjb2x1bW5zIG9yIHJvd3MgdGhlIGZvbGxvd2luZyBzeW50YXggaXMgdXNlZCBgLS0tLS0tLS0tYC4gQnkgZGVmYXVsdCB0aGlzIG5vdGF0aW9uIHdpbGwgY3JlYXRlIG5ldyBjb2x1bW5zLCBob3dldmVyIGlmIHRoZSBZQU1MIGlzIG1vZGlmZWQgdG8gc3BlY2lmeSB0byBjcmVhdGUgcm93cywgdGhhbiB0aGlzIHNhbWUgc3l0bmF4IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgcm93cy4gVGhlIG51bWJlciBvZiBkYXNoZXMgZG9lcyBub3QgbWF0dGVyLgoKNSkgVG8gYWRkIGEgcGFnZSB0byBhIG5hdmlnYXRpb24gYmFyIChhbHNvIGNhbGxlZCBhIG5hdmJhcikgdGhlIGZvbGxvd2luZyBzeW50YXggaXMgdXNlZCBgPT09PT09PWAuIFRoZSBudW1iZXIgb2YgZGFzaGVzIGRvZXMgbm90IG1hdHRlci4KCiMjIyBMYXlvdXQKCiMjIyMgQWRkaW5nIENvbHVtbnMKClRvIGFkZCBtdWx0aXBsZSBjb2x1bW5zIHRoZSBmb2xsb3dpbmcgc3ludGF4IGlzIHVzZWQgYC0tLS0tLS0tLWAgZm9yIGVhY2ggIGNvbHVtbiBhbmQgbm90aGluZyBhZGRpdGlvbmFsIGlzIHJlcXVpcmVkIGluIHRoZSBoZWFkZXIuCgpBZGRpdGlvbmFsIGZlYXR1cmVzIGFib3V0IHRoZSBjb2x1bW5zLCBzdWNoIGFzIHRoZSB3aWR0aCBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIGJyYWNrZXRzYHt9YGxpa2UgaW4gdGhlIGV4YW1wbGUgYmVsb3cuIE5vdGUgdGhhdCB0aGUgd29yZCBgQ29sdW1uYCBpc24ndCBuZWNlc3NhcnkuIEluIHRoaXMgZXhhbXBsZSB0d28gY29sdW1ucyBhcmUgY3JlYXRlZCB0aGF0IHdpbGwgYmUgb3JpZW50ZWQgbmV4dCB0byBvbmUgYW5vdGhlciBhbmQgZWxlbWVudHMgd2l0aGluIHRoZSBjb2x1bW5zIHdpbGwgYmUgcGxhY2VkIHRvcCB0byBib3R0b20uIAoKYGBge3IsIGVjaG8gPSBGQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImNvbHVtbnMucG5nIikpCmBgYAoKIyMjIyMgW1tzb3VyY2VdXShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9mbGV4ZGFzaGJvYXJkL2xheW91dHMuaHRtbCkKCgojIyMjIEFkZGluZyBSb3dzClRvIGFkZCBtdWx0aXBsZSByb3dzIC0gdGhlIHlhbWwgbmVlZHMgdG8gc3RhdGUgdGhhdCB0aGUgb3JpZW50YXRpb24gaXMgZm9yIHJvd3MgaW5zdGVhZCBvZiBmb3IgY29sdW1ucyAoc2VlIHRoZSBpbWFnZSBiZWxvdyksICBhbmQgdGhlbiB0aGUgc2FtZSBzeW50YXggaXMgdXNlZCBgLS0tLS0tLS0tYCAgZm9yIGVhY2ggcm93IGluc3RlYWQgb2YgY29sdW1ucy4gSW4gdGhpcyBleGFtcGxlIHR3byByb3dzIGFyZSBjcmVhdGVkIHRoYXQgd2lsbCBiZSBvcmllbnRlZCBvbiB0b3Agb2Ygb25lIGFub3RoZXIgYW5kIGVsZW1lbnRzIHdpdGhpbiB0aGUgcm93cyB3aWxsIGJlIHBsYWNlZCBuZXh0IHRvIGVhY2hvdGhlci4KCkFnYWluIHRoZSB3b3JkIGBSb3dgIGlzIG5vdCBhY3R1YWxseSBuZWNlc3NhcnkuCgpgYGB7ciwgZWNobyA9IEZBTFNFfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAicm93cy5wbmciKSkKYGBgCgojIyMjIyBbW3NvdXJjZV1dKGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL2ZsZXhkYXNoYm9hcmQvbGF5b3V0cy5odG1sKQoKU2VlIFtoZXJlXShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9mbGV4ZGFzaGJvYXJkL2xheW91dHMuaHRtbCkgZm9yIHRlbXBsYXRlIG9wdGlvbnMuCgoKIyMjIyMgVGFicwoKVG8gYWRkIHRhYnMgY29sdW1ucy9yb3dzIHdlIGNhbiB1c2UgdGhlIGZvbGxvd2luZzogCgpgYGAKQ29sdW1uIHsudGFic2V0fQpgYGAKCkhlcmUgaXMgYW4gZXhhbXBsZSwgd2hlcmUgdHdvIGNvbHVtbnMgYXJlIGNyZWF0ZWQgYW5kIHRoZW4gdHdvIHRhYnMgYXJlIGFkZGVkIHRvIHRoZSBzZWNvbmQgY29sdW1uLgoKYGBge3IsIGVjaG8gPSBGQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInRhYi5wbmciKSkKYGBgCgojIyMgU2hpbnkKCkludGVyYWN0aXZlIGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byBmbGV4ZGFzaGJvYXJkcy4gSW4gb3VyIGRhc2hib2FyZCB3ZSB3aWxsIHVzZSBwYWNrYWdlcyBzdWNoIGFzIGBEVGAgYW5kIGBMZWFmbGV0YCB0aGF0IGhhdmUgc2hpbnkgZnVuY3Rpb25hbGl0eS4gVGhpcyByZXF1aXJlcyB0aGF0IHNoaW55IGlzIGVuYWJsZWQgaW4gdGhlIFlBTUwgaGVhZGVyIGJ5IGluY2x1ZGluZyBgcnVudGltZTpzaGlueWAgaW4gdGhlIFlBTUwuCgpIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBZTUwgdGhhdCBpbmNsdWRlcyB0aGlzOgoKYGBge3IsIGVjaG8gPSBGQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInNoaW55X3ltbC5wbmciKSkKYGBgCgoqKioKCiMjICoqT3VyIERhc2hib2FyZCoqCioqCgpPSyEgTm93IHRoYXQgd2Uga25vdyBhIGJpdCBhYm91dCB0aGUgYmFzaWNzIG9mIGNyZWF0aW5nIGEgZGFzaGJvYXJkLCBsZXQncyBjcmVhdGUgb3VyIG93bi4KCldlIHdhbnQgdG8gY3JlYXRlIGEgZGFzaGJvYXJkIHRoYXQgaGFzIHNldmVyYWwgdGFicyB0aGF0IHdpbGwgbG9vayBsaWtlIHRoaXM6CgpgYGB7ciwgZWNobyA9IEZBTFNFfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiZGFzaGJvYXJkX3NjaG9vbC5wbmciKSkKYGBgCgojIyMgR2V0dGluZyBzdGFydGVkCgpUaGUgZmlyc3QgdGhpbmcgd2UgbmVlZCB0byBkbyB0byBjcmVhdGUgb3VyIGRhc2hib2FyZCBpcyB0byBjcmVhdGUgYSBuZXcgLlJtZCBkb2N1bWVudCBsaWtlIHNvIGluIFIgU3R1ZGlvOgoKYGBge3IsIGVjaG8gPSBGQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIm5ld3JtZC5wbmciKSkKYGBgCgpUaGVuIHdlIG5lZWQgdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgUiBNYXJrZG93biBkb2N1bWVudCB0byBjcmVhdGU6CgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInJtZHR5cGUucG5nIikpCgpgYGAKCiMjIyBZQU1MIGhlYWRlcgoKTmV4dCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgWUFNTCBoZWFkZXIgdG8gbG9vayBsaWtlIHRoaXM6CgpgYGB7ciwgZWNobyA9IEZBTFNFfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAib3VyX3lhbWwucG5nIikpCmBgYAoKCkFzIHlvdSBtaWdodCBleHBlY3QsIGB0aXRsZTpgIGluZGljYXRlcyB0aGUgdGl0bGUgb2Ygb3VyIGRhc2hib2FyZC4KClRoZSBgb3V0cHV0OmAgbGluZSBzcGVjaWZpZXMgd2hhdCB0eXBlIG9mIG91dHB1dCB3ZSB3YW50IHRoZSAuUm1kIGZpbGUgdG8gYmUgcmVuZGVyZWQuCgpXZSBuZWVkIHRvIGluY2x1ZGUgYGZsZXhkYXNoYm9hcmQ6OmZsZXhfZGFzaGJvYXJkOmAgYXMgdGhlIG91dHB1dCB0byBjcmVhdGUgYSBkYXNoYm9hcmQgd2l0aCB0aGUgYGZsZXhkYXNoYm9hcmRgIHBhY2thZ2UuIFRoaXMgY2FuIGJlIGluY2x1ZGVkIG9uIHRoZSBzYW1lIGxpbmUgYXMgYG91dHB1dDpgIG9yIG9uIHRoZSBuZXh0IGxpbmUgd2l0aCBhIHByZWNlZGluZyB0YWIuCgpOb3RlIHRoYXQgWUFNTCBpcyBzZW5zYXRpdmUgdG8gc3BhY2luZywgdGh1cyB0aGlzIHRhYiBpcyByZXF1aXJlZCB0byBnZXQgdGhlIHByb3BlciBvdXRwdXQuCgpUaGVuIHRoZSBuZXh0IGZvdXIgbGluZXMgYXJlIGFyZ3VtZW50cyBmb3IgaG93IHRoZSBkYXNoYm9hcmQgc2hvdWxkIGJlIGNyZWF0ZWQuCgoxKSBgbG9nbzpgIGFsbG93cyB5b3UgdG8gaW5jbHVkZSBhIGxvZ28gb24gdG9wIG9mIHlvdXIgZGFzaGJvYXJkLiBXaXRoIHRoaXMgdGhlbWUgdGhpcyB3aWxsIGJlIGluIHRoZSB1cHBlciBsZWZ0IGNvcm5lci4gVGhlIGxvZ28gd2UgY2hvc2UgdG8gdXNlIGNhbWUgZnJvbSBbaGVyZV0oaHR0cHM6Ly9pY29uYXJjaGl2ZS5jb20vKSwgYnV0IHlvdSBjb3VsZCB0aGVvcmV0aWNhbGx5IHVzZSBhbnkgcG5nIG9mIGFwcHJvcHJpYXRlIHNpemUuCgoyKSBgdGhlbWU6YCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgaG93IHRoZSBkYXNoYm9hcmQgd2lsbCBsb29rIGluIGdlbmVyYWwuIE5vdGUgdGhhdCB0aGlzIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgZ2VuZWFybCBsb29rIG9mIGFueSB0eXBlIG9mIFIgTWFya2Rvd24gb3V0cHV0LCBub3QganVzdCBmbGV4ZGFzaGJvYXJkcy4gU2VlIFtoZXJlXShodHRwczovL3d3dy5kYXRhZHJlYW1pbmcub3JnL3Bvc3Qvci1tYXJrZG93bi10aGVtZS1nYWxsZXJ5LykgZm9yIGEgbGlzdCBvZiBvcHRpb25zLiBJbiBvdXIgY2FzZSB0aGUgdGhlbWUgaXMgY2FsbGVkIHJlYWRhYmxlIGFuZCB3aWxsIGNyZWF0ZSBkb2N1bWVudHMgdGhhdCBsb29rIGxpa2UgdGhpczoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJyZWFkYWJsZS5wbmciKSkKYGBgCgojIyMjIyBbW3NvdXJjZV1dKGh0dHBzOi8vd3d3LmRhdGFkcmVhbWluZy5vcmcvcG9zdC9yLW1hcmtkb3duLXRoZW1lLWdhbGxlcnkvKQoKMykgYG9yaWVudGF0aW9uOmAgdGhlIG9wdGlvbnMgYXJlIGBjb2x1bW5zYCBvciBgcm93c2AgYW5kIHNwZWNpZmllcyBpZiB0aGUgYC0tLS0tLS0tYCBzeW50YXggY3JlYXRlcyByb3dzIG9yIGNvbHVtbnMgZm9yIHRoZSBsYXlvdXQuIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB0aGUgb3B0aW9uIGlzIGBjb2x1bW5zYC4KCjQpIGBzb3VyY2VfY29kZTpgIHNwZWNpZmllcyBpZiBhIFVSTCB3aWxsIGJlIGluY2x1ZGVkIGFzIGEgbmF2aWdhdGlvbiBiYXIgaXRlbSB3aXRoIGFjY2VzcyB0byB0aGUgc291cmNlIGNvZGUuIAoKNSkgYHZlcnRpY2FsX2xheW91dDpgIFRoZSBvcHRpb25zIGFyZSBgZmlsbGAgb3IgYHNjcm9sbGAuIEZpbGwgY2F1c2VzIHRoZSBjaGFydHMgdG8gcmVzaXplIHRvIGZpbGwgdGhlIHBhZ2UsIHdoaWxlIHRoZSBzY3JvbGwgb3B0aW9uIHJlbmRlcnMgcGxvdHMgYXMgdGhlaXIgbmF0dXJhbCBoZWlnaHQgd2hpY2ggbWF5IG9yIG1heSBub3QgcmVxdWlyZSBzY3JvbGxpbmcgdGhlIHBhZ2UuCgpUaGVyZSBhcmUgbWFueSBvdGhlciBhcmd1bWVudCBvcHRpb25zIGZvciBob3cgdGhlIGRhc2hib2FyZCBpcyBkaXNwbGF5ZWQuCgpZb3UgY2FuIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4gdGhlIGNvbnNvbGUgdG8gc2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFyZ3VtZW50cyBpbiB0aGUgaGVscCBwYW5lIG9mIHRoZSBSIFN0dWRpbyBbSURFXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnRlZ3JhdGVkX2RldmVsb3BtZW50X2Vudmlyb25tZW50KS4KCmBgYHtyfQo/ZmxleGRhc2hib2FyZDo6ZmxleF9kYXNoYm9hcmQoKQpgYGAKCkFsc28gc2VlIHRoZSBjcmFuIFtkb2N1bWVudGF0aW9uXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZmxleGRhc2hib2FyZC9mbGV4ZGFzaGJvYXJkLnBkZikgZm9yIG1vcmUgZGV0YWlscy4KCiMjIyBMb2FkaW5nIHRoZSBwYWNrYWdlcyBhbmQgZGF0YQoKU2luY2Ugd2UgYXJlIGNyZWF0aW5nIG91ciBkYXNoYm9hcmQgaW4gYSBuZXcgUm1kIGZpbGUsIHdlIG5lZWQgdG8gbG9hZCB0aGUgbmVjZXNzYXJ5IHBhY2thZ2VzIGFuZCB0aGUgd3JhbmdsZWQgZGF0YSB0aGF0IHdlIGNyZWF0ZWQgaW4gdGhpcyBSbWQgZmlsZS4gSW4gdGhhdCBSbWQgZmlsZSwgaXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpcy4gTm90ZSB0aGF0IGFsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBzaG93biB3b3VsZCBiZSBhZGRlZCB0byB0aGUgUm1kIGZpbGUgZm9yIHRoZSBkYXNoYm9hcmQgYW5kIGFyZSBzaW1wbHkgc2hvd24gaGVyZSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgoKYGBge3IsZXZhbCA9IEZBTFNFfQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoZmxleGRhc2hib2FyZCkKbGlicmFyeShzaGlueSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHJtYXBzaGFwZXIpCmxpYnJhcnkoaHRtbHRvb2xzKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShEVCkKYGBgCgpgYGB7cixldmFsID0gRkFMU0V9CgpzaG9vdGluZ19kYXRhIDwtIHJlYWRfY3N2KGhlcmUoInByb2Nlc3NlZF9kYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhX3ByZV9nZW9fd3JhbmdsZWQuY3N2IikpCgpzaG9vdGluZ19kYXRhX2dlb2NvZGVkIDwtIHJlYWRfY3N2KGhlcmUoInByb2Nlc3NlZF9kYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG9vdGluZ19kYXRhX3dyYW5nbGVkLmNzdiIpKQpgYGAKCgojIyMgQ3JlYXRpbmcgcGFnZXMKClJlY2FsbCB0aGF0IGA9PT1gIGlzIHVzZWQgdG8gZGVzaWduYXRlIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIG5hdmlhZ2F0aW9uIGJhci4KCgpXZSB3YW50IDcgaXRlbXMgYmVzaWRlcyB0aGUgc291cmNlIGNvZGUgKHdoaWNoIHdhcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBZQU1MIGNvZGUpLgoKClNvIGZpcnN0IHdlIHdpbGwgY3JlYXRlIDcgZGl2aXNpb25zIGZvciB0aGVzZSBtYWluIHBhZ2VzLiBXZSB3aWxsIGFkZCBpY29ucyB0byBlYWNoIGZyb20gW0ZvbnQgQXdlc29tZV0oaHR0cHM6Ly9mb250YXdlc29tZS5jb20vaWNvbnM/ZD1nYWxsZXJ5KS4KClVzZSB0aGlzIFtsaW5rXShodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9pY29ucz9kPWdhbGxlcnkpIHRvIGZpbmQgb3RoZXIgaWNvbiBvcHRpb25zLiBJZiB5b3UgY2xpY2sgb24gdGhlICJzdGFydCB1c2luZyB0aGlzIGljb24iIGJvdHRvbiBpdCB3aWxsIHRha2UgeW91IHRvIGEgcGFnZSB3aXRoIGh0bWwgY29kZSBsaWtlIHRoaXM6ICAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iNjAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImZvbnRhd2Vzb21lLnBuZyIpKQpgYGAKCiMjIyMgW1tzb3VyY2VdXShodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9pY29ucy9kYXRhYmFzZT9zdHlsZT1zb2xpZCkKCgpPbmx5ICB0aGUgYGZhLWRhdGFiYXNlYCBwb3J0aW9uIGlzIHJlcXVyaXJlZCBpbiB0aGUgYnJhY2tldHMgYWZ0ZXIgYGRhdGEtaWNvbj1gIHRvIGFkZCB0aGUgaWNvbiB0byB0aGUgbmF2aWdhdGlvbiBiYXIuCgpgYGAKCkFib3V0IHtkYXRhLWljb249ImZhLXF1ZXN0aW9uLWNpcmNsZSJ9Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIERhdGEge2RhdGEtaWNvbj0iZmEtZGF0YWJhc2UifQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAoKVVMgU3RhdGlzdGljcyB7ZGF0YS1pY29uPSJmYS1mbGFnIn0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU3RhdGUgU3RhdGlzdGljcyB7ZGF0YS1pY29uPWZhLWZsYWctY2hlY2tlcmVkfQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk1hcCB7ZGF0YS1pY29uPSJmYS1tYXAifQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClR1dG9yaWFsIHsuc3Rvcnlib2FyZCBkYXRhLWljb249ImZhLWxpc3Qtb2wifQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkhvdGxpbmUge2RhdGEtaWNvbj0iZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUifQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmBgYAoKIyMjIFRoZSBBYm91dCBwYWdlCgpPSywgd2Ugd2lsbCBzdGFydCB3aXRoIHRoZSBBYm91dCBwYWdlLgoKT24gdGhpcyBwYWdlIHdlIHdpbGwgaGF2ZSB0d28gY29sdW1ucyAtIG9uZSB3aGljaCB3aWxsIGJlIHdpZGVyIHRoYW4gdGhlIG90aGVyLiAgU2l6ZSBzcGVjaWZpY2F0aW9ucyBvbiBgZmxleGRhc2hib2FyZGAgYXJlIHVuaXRsZXNzOyB0aGUgd2lkdGggb2YgYW55IGNvbHVtbiBpbmNsdWRlZCBvbiBhIHBhZ2UgaXMgYSBmdW5jdGlvbiBvZiB0aGUgd2lkdGggc2V0IGZvciBhIGNvbHVtbiBhZ2FpbnN0IHRoZSBzdW0gb2Ygd2lkdGhzIGZvciBhbGwgY29sdW1ucyBvbiB0aGF0IHBhZ2UuIElmIHdlIHNldCBjb2x1bW5zIHNpemVzIG9mIDYwMCBhbmQgMzAwIG9uIGEgcGFnZSB3aXRoIHR3byBjb2x1bW5zLCBvbmUgY29sdW1uIHdpbGwgYmUgdHdpY2UgYXMgbGFyZ2UgYXMgdGhlIG90aGVyIGNvbHVtbi4gV2Ugd2FudCB0aGUgbGVmdCBjb2x1bW4gdG8gYmUgcXVpdGUgYSBiaXQgbGFyZ2VyIHRoYW4gdGhlIHJpZ2h0LCBzbyB3ZSB3aWxsIHNldCB0aGUgbGVmdCBhcyBgNzBgIGFuZCB0aGUgcmlnaHQgYXMgYDMwYC4KCgpUaHVzIHdlIHdpbGwgc3RhcnQgb3V0IGxpa2Ugc286CgpgYGAKQWJvdXQge2RhdGEtaWNvbj0iZmEtcXVlc3Rpb24tY2lyY2xlIn0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKCkNvbHVtbiB7ZGF0YS13aWR0aCA9IDcwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMKCkNvbHVtbiB7ZGF0YS13aWR0aCA9IDMwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMKCmBgYAoKClJlY2FsbCB0aGF0IGAjIyNgIGlzIHVzZWQgdG8gYWRkIGVsZW1lbnRzIHRvIGNvbHVtbnMgYW5kIHJvd3MuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB0ZXh0IG5leHQgdG8gdGhlIGAjIyNgIHN5bnRheCB0aGF0IGRlc2lnbmF0ZXMgYW4gZWxlbWVudCBvZiBvdXIgZGFzaGJvYXJkLiBQcmV2aW91c2x5IGluIHRoZSBleGFtcGxlcyB0aGF0IHdlIHNob3dlZCBhIGhlYWRlciB3YXMgdXNlZCBsaWtlIHNvIGAjIyMgaGVhZGVyYDoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJ0YWIucG5nIikpCmBgYAoKV2UgZG9uJ3QgYWN0dWFsbHkgd2FudCBhIGhlYWRlciBub3csIHNvIHdlIGNhbiBzaW1wbHkgdXNlIGAjIyNgIHdpdGhvdXQgYW55IHRleHQgZm9sbG93aW5nIGl0LiBOb3RlIHRoYXQgeW91IGNhbiBnZXQgYXdheSB3aXRoIG5vdCB1c2luZyB0aGUgYCMjI2AgYnV0IHNvbWUgZWxlbWVudHMgd2lsbCBub3QgcmVuZGVyIHByb3Blcmx5LiAKCk5vdyB3ZSB3aWxsIGFkZCBhIGJsb2NrIG9mIHRleHQgZGVzY3JpYmluZyB0aGUgZGFzaGJvYXJkIHRvIHRoZSBmaXJzdCBjb2x1bW4gYW5kIHdlIHdpbGwgYWRkIGFuIGltYWdlIHRvIHRoZSBzZWNvbmQgY29sdW1uIGxpa2UgdGhlIGZvbGxvd2luZy4gTm90aWNlIHRoYXQgdHdvIGFzdHJpeCBgKipgIGFyb3VuZCB0ZXh0IG1ha2VzIHRoZW0gYXBwZWFyIGFzIGJvbGQgYW5kIG9uZSBgKmAgbWFrZXMgaXQgYXBwZWFyIGFzIGl0YWxpYy4gU2VlIFt0aGlzIFJTdHVkaW8gY2hlYXRzaGVldF0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vbGVzc29uLTE1Lmh0bWwpIGZvciBzb21lIGJhc2ljIG1hcmtkb3duIHN5bnRheCBmb3Igc3R5bGl6aW5nIHRleHQ6CgpgYGB7ciwgZWNobyA9IEZBTFNFfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAibWFya2Rvd25zeW50YXgucG5nIikpCmBgYAoKClRodXMgdGhpcyBpcyB3aGF0IHRoZSBjb2RlIGZvciB0aGlzIHBhZ2UgbG9va3MgbGlrZToKCmBgYApBYm91dCB7ZGF0YS1pY29uPSJmYS1xdWVzdGlvbi1jaXJjbGUifQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAoKQ29sdW1uIHtkYXRhLXdpZHRoPTcwMH0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIEFib3V0CgoqKldoYXQgaXMgdGhlIHB1cnBvc2Ugb2YgdGhpcyBkYXNoYm9hcmQ/KioKClRoaXMgZGFzaGJvYXJkIGhhcyB0d28gcHVycG9zZXM6CgoxLiBUbyBJbGx1c3RyYXRlIHRyZW5kcyBpbiBzY2hvb2wgc2hvb3RpbmcgZXZlbnRzIGluIHRoZSBVbml0ZWQgU3RhdGVzCjIuIFRvIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBkYXNoYm9hcmQgdXNpbmcgYFJgCgoKVGhpcyBkYXNoYm9hcmQgdXNlcyBkYXRhIGZyb20gdGhlIG9wZW4tc291cmNlIFtLLTEyIFNob29sIFNob290aW5nIERhdGFiYXNlXShodHRwczovL3d3dy5jaGRzLnVzL3NzZGIvZGF0YXNldC8pIGRvd25sb2FkZWQgZnJvbSB0aGUgW0NlbnRlciBmb3IgSG9tZWxhbmQgRGVmZW5zZSBhbmQgU2VjdXJpdHldKGh0dHBzOi8vd3d3LmNoZHMudXMvYy8pIGF0IHRoZSBhdCB0aGUgW05hdmFsIFBvc3RncmFkdWF0ZSBTY2hvb2woTlBTKV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTmF2YWxfUG9zdGdyYWR1YXRlX1NjaG9vbCkuIFRoaXMgZGF0YSB3YXMgZG93bmxvYWRlZCBpbiBKdW5lIG9mIDIwMjAuCgoKUmllZG1hbiwgRGF2aWQsIGFuZCBEZXNtb25kIE/igJlOZWlsbC4g4oCcQ0hEUyDigJMgSy0xMiBTY2hvb2wgU2hvb3RpbmcgRGF0YWJhc2Uu4oCdIENlbnRlciBmb3IgSG9tZWxhbmQgRGVmZW5zZSBhbmQgU2VjdXJpdHksIEp1bmUgMjAyMCwgW3d3dy5jaGRzLnVzL3NzZGJdKHd3dy5jaGRzLnVzL3NzZGIpLgoKClRoaXMgZGF0YWJhc2UgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgc2Nob29sIHNob290aW5nIGV2ZW50cyBmb3Igc3R1ZGVudHMgaW4gZ3JhZGVzIEstMTIgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgZGF0aW5nIGJhY2sgdG8gMTk3MC4gVGhlIGRhdGFiYXNlIGhhcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5vdCBzaG93biBvbiBvdXIgZGFzaGJvYXJkIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG86IAoKKiBMb2NhdGlvbiBvZiB0aGUgZXZlbnQgYXQgdGhlIHNjaG9vbCAgCiogSWYgdGhlIGV2ZW50IG9jY3VyZWQgZHVyaW5nIGEgc3BvcnRpbmcgZXZlbnQgIAoqIFRpbWUgb2YgZGF5IG9mIHRoZSBldmVudCAgCiogRGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBldmVudCAgCiogU291cmNlIGZvciB0aGUgc2hvb3RpbmcgaW5mb3JtYXRpb24gIAoqIElmIHRoZSBldmVudCB3YXMgcHJlLXBsYW5uZWQgb3Igbm90ICAKKiBTaG9vdGVyJ3MgYWN0aW9ucyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHNob290aW5nICAKKiBTaG9vdGVyIGNoYXJhY3RlcmlzdGljcyAoYWZmaWxpYXRpb24gd2l0aCB0aGUgc2Nob29sLCBpZiB0aGV5IGhhZCBhY2NvbXBsaWNlcywgaWYgdGhleSB0b29rIGhvc3RhZ2VzLCBhbmQgdGhlaXIgYWdlIGFuZCByYWNlKSAgCiogVmljdG9tIGNoYXJhY3RlcmlzdGljcyAoYWZmaWNsaWF0aW9uIHdpdGggdGhlIHNjaG9vbCwgaWYgdGhleSB3ZXJlIHRhcmdldGVkLCB0aGVpciBhZ2UgYW5kIHJhY2UpICAKCkFjY29yZGluZyB0byB0aGUgW0stMTIgU2hvb2wgU2hvb3RpbmcgRGF0YWJhc2VdKGh0dHBzOi8vd3d3LmNoZHMudXMvc3NkYi9kYXRhc2V0Lykgd2Vic2l0ZToKCj4gVGhlIFNjaG9vbCBTaG9vdGluZyBEYXRhYmFzZSBQcm9qZWN0IGlzIGNvbmR1Y3RlZCBhcyBwYXJ0IG9mIHRoZSBbQWR2YW5jZWQgVGhpbmtpbmcgaW4gSG9tZWxhbmQgU2VjdXJpdHkgKEhTeCldKGh0dHBzOi8vd3d3LmNoZHMudXMvYy9hY2FkZW1pYy1wcm9ncmFtcy9oc3gvKSBwcm9ncmFtIGF0IHRoZSBOYXZhbCBQb3N0Z3JhZHVhdGUgU2Nob29s4oCZcyBbQ2VudGVyIGZvciBIb21lbGFuZCBEZWZlbnNlIGFuZCBTZWN1cml0eSAoQ0hEUyldKENlbnRlciBmb3IgSG9tZWxhbmQgRGVmZW5zZSBhbmQgU2VjdXJpdHkgKENIRFMpLgoKPiBUaGUgZGF0YWJhc2UgY29tcGlsZXMgaW5mb3JtYXRpb24gZnJvbSBtb3JlIHRoYW4gMjUgZGlmZmVyZW50IHNvdXJjZXMgaW5jbHVkaW5nIHBlZXItcmV2aWV3ZWQgc3R1ZGllcywgZ292ZXJubWVudCByZXBvcnRzLCBtYWluc3RyZWFtIG1lZGlhLCBub24tcHJvZml0cywgcHJpdmF0ZSB3ZWJzaXRlcywgYmxvZ3MsIGFuZCBjcm93ZC1zb3VyY2VkIGxpc3RzIHRoYXQgaGF2ZSBiZWVuIGFuYWx5emVkLCBmaWx0ZXJlZCwgZGVjb25mbGljdGVkLCBhbmQgY3Jvc3MtcmVmZXJlbmNlZC4gQWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBpcyBiYXNlZCBvbiBvcGVuLXNvdXJjZSBpbmZvcm1hdGlvbiBhbmQgM3JkIHBhcnR5IHJlcG9ydGluZy4KCj4gIlRoaXMgZGF0YWJhc2Ugd2FzIGRldmVsb3BlZCBmcm9tIG9wZW4tc291cmNlIGluZm9ybWF0aW9uIGFuZCBtYXkgaW5jbHVkZSByZXBvcnRpbmcgZXJyb3JzLiIKCgoqKldhbnQgdG8gbGVhcm4gaG93IHRvIGNyZWF0ZSBhIGRhc2hib2FyZCBqdXN0IGxpa2UgdGhpcz8qKgoKVmlzaXQgdGhlICpUdXRvcmlhbCogcGFnZSBvZiB0aGlzIGRhc2hib2FyZCB0byBmaXJzdCBsZWFybiB0aGUgYmFzaWNzIGFib3V0IGJ1aWxkaW5nIGEgZGFzaGJvYXJkIHdpdGggdGhlIGBmbGV4ZGFzaGJvYXJkYCBwYWNrYWdlLgoKQXQgdGhlIGVuZCBvZiB0aGUgdHV0b3JpYWwgd2UgcHJvdmlkZSBhIGxpbmsgdG8gdGhpcyBbc3VwcGxlbWVudGFyeSByZXNvdXJjZSBieSB0aGUgT3BlbiBDYXNlIFN0dWRpZXMgcHJvamVjdF0oSU5DTFVERSBMSU5LIEhFUkUpLCB3aGljaCBwcm92aWRlcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGhvdyAqKip0aGlzIGRhc2hib2FyZCoqKiB3YXMgY3JlYXRlZC4KCldlIGhhdmUgYWxzbyBpbmNsdWRlZCB0aGUgc291cmNlIGNvZGUgKHNlZSB1cHBlciByaWdodC1oYW5kIGNvcm5lcikgaW4gdGhpcyBkYXNoYm9hcmQgZm9yIG1vcmUgZXhwZXJpZW5jZWQgYFJgIHVzZXJzIGxvb2tpbmcgdG8gbWltaWMgc29tZSBvZiB3aGF0IHdlIGRpZCBpbiB0aGlzIGRhc2hib2FyZCBpbiB0aGVpciBvd24uCgoKKipEaXNjbGFpbWVyKioKClRoZSBwdXJwb3NlIG9mIHRoZSBbT3BlbiBDYXNlIFN0dWRpZXNdKGh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pbyl7dGFyZ2V0PSJfYmxhbmsifSBwcm9qZWN0IGlzICoqdG8gZGVtb25zdHJhdGUgdGhlIHVzZSBvZiB2YXJpb3VzIGRhdGEgc2NpZW5jZSBtZXRob2RzLCB0b29scywgYW5kIHNvZnR3YXJlIGluIHRoZSBjb250ZXh0IG9mIG1lc3N5LCByZWFsLXdvcmxkIGRhdGEqKi4KCkEgZ2l2ZW4gY2FzZSBzdHVkeSBkb2VzIG5vdCBjb3ZlciBhbGwgYXNwZWN0cyBvZiB0aGUgcmVzZWFyY2ggcHJvY2VzcywgaXMgbm90IGNsYWltaW5nIHRvIGJlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdheSB0byBhbmFseXplIGEgZ2l2ZW4gZGF0YSBzZXQsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgbWFraW5nIHBvbGljeSBkZWNpc2lvbnMgd2l0aG91dCBleHRlcm5hbCBjb25zdWx0YXRpb24gZnJvbSBzY2llbnRpZmljIGV4cGVydHMuIAoKV2UgYXJlIHNpbXBseSB1c2luZyBkYXRhIGZyb20gdGhlIFtLLTEyIFNob29sIFNob290aW5nIERhdGFiYXNlXShodHRwczovL3d3dy5jaGRzLnVzL3NzZGIvZGF0YXNldC8pLCB3ZSBkaWQgbm90IGNyZWF0ZSB0aGlzIGRhdGFiYXNlLiBXZSBhY2tub3dsZWdlIChsaWtlIHRoZWlyIHdlYnNpdGUpIHRoYXQgdGhlcmUgbWF5IGJlIHJlcG9ydGluZyBlcnJvcnMgaW4gdGhpcyBkYXRhYmFzZS4gCgoqKkxpY2Vuc2UqKgoKVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIFsoQ0MgQlktTkMgMy4wKV0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLzMuMC91cy8pe3RhcmdldD0iX2JsYW5rIn0gVW5pdGVkIFN0YXRlcyBMaWNlbnNlLgoKQ29sdW1uIHtkYXRhLXdpZHRoPTMwMH0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjCgonJyd7ciwgZWNobz1GQUxTRSwgZmlnLmNhcD0iW1Bob3RvZ3JhcGggYnkgTmF0aGFuIER1bWxhb10oaHR0cHM6Ly91bnNwbGFzaC5jb20vcGhvdG9zL3hQSG1tVktTOGxNKSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJuYXRoYW4tZHVtbGFvLXhQSG1tVktTOGxNLXVuc3BsYXNoLmpwZyIpKQonJycKYGBgCgpUaGUgaW1hZ2UgdXNlZCBpbiB0aGlzIHNlY29uZCBjb2x1bW4gaXMgZnJvbSBhIHdlYnNpdGUgY2FsbGVkIHVuc3BsYXNoIChodHRwczovL3Vuc3BsYXNoLmNvbS8pIHdoaWNoIGhvc3RzIGltYWdlcyBmb3IgZnJlZSB1c2UgYnV0IGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaG90b2dyYXBoZXIgaWYgeW91IGNob3NlIHRvIGNyZWRpdCB0aGVtLiBBIHNob3J0IGxpbmsgZm9yIHRoaXMgaW1hZ2Ugd2FzIGZvdW5kIGJ5IGNsaWNraW5nIG9uIGl0IGFuZCB0aGVuIGNsaWNraW5nIHRoZSBzaGFyZSBidXR0b24uCgpOb3RpY2UgdGhlIGBlY2hvID0gRkFMU0VgIHNwZWNpZmljYXRpb24gZm9yIHRoZSBjb2RlIGNodW5rIHdoaWNoIGNhdXNlcyB0aGUgY29kZSB0byBiZSBldmFsdWF0ZWQgYnV0IGJ1dCBub3Qgc2hvd24sIHdoaWxlIGBmaWcuY2FwYCBhZGRzIHRoZSBmaWd1cmUgY2FwdGlvbi4KClRoZSBpbWFnZSBpcyBpbmNsdWRlZCB1c2luZyB0aGUgYGluY2x1ZGVfZ3JhcGhpY3MoKWAgZnVuY3Rpb24gb2YgdGhlIGBrbml0cmAgcGFja2FnZS4gV2UgbmVlZCB0byBzcGVjaWZ5IHdoZXJlIHRoaXMgaW1hZ2UgaXMgbG9jYXRlZCBmb3IgdGhpcyB0byB3b3JrLiBZb3UgY2FuIGRvIHRoaXMgd2l0aG91dCBzcGVjaWZ5aW5nIGEgcGF0aCBpZiB0aGUgaW1hZ2UgZmlsZSBpcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91ciAuUm1kIGZpbGUgdGhhdCB5b3UgYXJlIHVzaW5nIHRvIGNyZWF0ZSB5b3VyIGRhc2hib2FyZC4gSG93ZXZlciB1c2luZyB0aGUgYGhlcmUoKWAgZnVuY3Rpb24gb2YgdGhlIGBoZXJlYCBwYWNrYWdlIHdlIGNhbiBvcmFuaXplIG91ciBmaWxlcyBhIGJpdC4gVGhpcyBmdW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlIHBhdGggd2hlcmV2ZXIgd2UgaGF2ZSBpbmNsdWRlZCBhbiBSU3R1ZGlvIHByb2plY3QgZmlsZSwgdGhpcyBjYW4gYmUgZG9uZSBpbiBSU3R1ZGlvIGxpa2Ugc286CgpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LndpZHRoPSI2MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciICwgInByb2plY3QucG5nIikpCmBgYApJZiB5b3UgYXJlIG5ldyB0byB1c2luZyBSU3R1ZGlvIHByb2plY3RzLCBwbGVhc2Ugc2VlIHRoaXMgW2xpbmtdKGh0dHBzOi8vcjRkcy5oYWQuY28ubnovd29ya2Zsb3ctcHJvamVjdHMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgpUaGVuIGlmIHdlIGNyZWF0ZSBhIGRpcmVjdG9yeSBvciBmb2xkZXIgY2FsbGVkIGBpbWdgIGFuZCBwbGFjZSBvdXIgaW1hZ2UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnksIHRoZW4gd2UgY2FuIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCB0byB0aGlzIGZpbGUgb24gb3VyIGNvbXB1dGVyLCBieSBqdXN0IHVzaW5nIGBoZXJlOjpoZXJlKCJpbWciLCAibmFtZV9vZl9pbWFnZS5wbmciKWAuIFRoZSBgaW5jbHVkZV9ncmFwaGljcygpYCBmdW5jdGlvbiB3b3JrcyBmb3IgYSB2YXJpZXR5IGltYWdlIGZpbGUgdHlwZXMuIAoKYGBge3IsIGVjaG89RkFMU0UsIG91dC53aWR0aD0iNjAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiAsICJuZXdkaXIucG5nIikpCmBgYAoKIyMjIFRoZSBEYXRhIHBhZ2UKClRvIGNyZWF0ZSB0aGUgc3RydWN0dXJlIGZvciB0aGlzIHBhZ2UgdGhhdCB3aWxsIGRpc3BsYXkgdGhlIGRhdGEsIHdlIHdpbGwgaGF2ZSB0d28gY29sdW1ucywgd2l0aCB0aGUgZmlyc3Qgb25lIChvbiB0aGUgbGVmdCkgd2lkZXIgdGhhbiB0aGUgb3RoZXIuIEFnYWluIHdlIHdpbGwgaGF2ZSBhIGJsb2NrIG9mIHRleHQgaW4gdGhlIGNvbHVtbiBvbiB0aGUgbGVmdCBsaWtlIHNvOgoKYGBgClRoZSBEYXRhIHtkYXRhLWljb249ImZhLWRhdGFiYXNlIn0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKCgpDb2x1bW4ge2RhdGEtd2lkdGg9NzB9Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIwoKVGhlIGRhdGEgaXMgZnJvbSB0aGUgW0NlbnRlciBmb3IgSG9tZWxhbmQgRGVmZW5zZSBhbmQgU2VjdXJpdHkgKENIRFMpXShDZW50ZXIgZm9yIEhvbWVsYW5kIERlZmVuc2UgYW5kIFNlY3VyaXR5IChDSERTKSBbSy0xMiBTaG9vbCBTaG9vdGluZyBEYXRhYmFzZV0oaHR0cHM6Ly93d3cuY2hkcy51cy9zc2RiL2RhdGFzZXQvKS4gTWV0aG9kcyBhcmUgb3V0bGluZWQgW2hlcmVdKGh0dHBzOi8vd3d3LmNoZHMudXMvc3NkYi9tZXRob2RzLykgYXMgdG8gaG93IGluY2lkZW50cyB3ZXJlIGlkZW50aWZpZWQgYW5kIGF1dGhlbnRpY2F0ZWQuCgpBY2NvcmRpbmcgdG8gdGhlaXIgd2Vic2l0ZTogCj4gIlRoaXMgZGF0YWJhc2Ugd2FzIGRldmVsb3BlZCBmcm9tIG9wZW4tc291cmNlIGluZm9ybWF0aW9uIGFuZCBtYXkgaW5jbHVkZSByZXBvcnRpbmcgZXJyb3JzLiIKCgoKQ29sdW1uIHtkYXRhLXdpZHRoPTMwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMKCmBgYAoKCgpOb3cgd2Ugd2lsbCBhZGQgb3VyIGBEVF90YWJsZWAgdG8gdGhlIGZpcnN0IGNvbHVtbi4gRmlyc3Qgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBjb2RlIHRoYXQgd2UgcHJldmlvdXNseSB1c2VkIHRvIGNyZWF0ZSB0aGUgYERUX3RhYmxlYCBpbiBvdXIgZGFzaGJvYXJkIC5SbWQgZmlsZToKCgpgYGB7cn0KRFRfdGFibGUgPC0gc2hvb3RpbmdfZGF0YSU+JQogIGRwbHlyOjpzZWxlY3QoRGF0ZSwKICAgICAgICAgICAgICAgIFNjaG9vbCwKICAgICAgICAgICAgICAgIENpdHksCiAgICAgICAgICAgICAgICBTdGF0ZSwKICAgICAgICAgICAgICAgIGBLaWxsZWQgKGluY2x1ZGVzIHNob290ZXIpYCwKICAgICAgICAgICAgICAgIGBOYXJyYXRpdmUgKERldGFpbGVkIFN1bW1hcnkvIEJhY2tncm91bmQpYCkgJT4lCiAgcmVuYW1lKCJEZWF0aHMiID0gYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgKSAlPiUKICByZW5hbWUoIk5hcnJhdGl2ZSIgPSBgTmFycmF0aXZlIChEZXRhaWxlZCBTdW1tYXJ5LyBCYWNrZ3JvdW5kKWApCmBgYAoKCldlIHRoZW4gaW5jbHVkZSBzb21lIGNvZGUgdG8gcmVuZGVyIHRoaXMgaW50ZXJhY3RpdmUgdGFibGUgaW4gb3VyIGRhc2hib2FyZC4gU2luY2Ugd2UgaGF2ZSBgc2hpbnlgIGVuYWJsZWQgaW4gb3VyIFlBTUwgaGVhZGVyLCB3ZSBjYW4gdXNlIHRoZSBgcmVuZGVyRGF0YVRhYmxlKClgIG9mIHRoZSBgRFRgIHBhY2thZ2UgdG8gcHJvZHVjZSB0aGUgb3V0cHV0IHdlIGRlc2lyZS4gV2UgYWxzbyB3YW50IHRvIHVzZSB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IHRvIHNwZWNpZnkgaG93IHRoZSBkYXRhIGlzIHJlbmRlcmVkLiBUaGUgYHNjcm9sbGVyID0gVFJVRWAgYXJndW1lbnQgYWRkcyBhIHNjcm9sbCBiYXIgdG8gdGhlIHRhYmxlLCB0aGUgc2Nyb2xsWSBhcmd1bWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgc2Nyb2xsIGJhciBzaG91bGQgYmUgZm9yIHRoZXkgWSBheGlzIGRpcmVjdGlvbiAodXAgYW5kIGRvd24pIG9mIHRoZSB0YWJsZSBhbmQgc3BlY2lmaWVzIGhvdyBsYXJnZSB0aGUgc2Nyb2xsZXIgc2hvdWxkIGJlLCB0aGUgYHBhZ2VMZW5ndGhgIGFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSByb3dzIHNob3VsZCBiZSBkaXNwbGF5ZWQgc2ltdWx0YW5lb3VzbHkgd2l0aGluIHRoZSB0YWJsZSwgYW5kIHRoZSBgYXV0b1dpZHRoID0gVFJVRWAgYXJndW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIHRhYmxlIHNob3VsZCBmaXQgdGhlIHNwYWNlIG9mIHRoZSBjb2x1bW4gb3IgcGFnZSBpdCBpcyB3aXRoaW4uIFdlIHdpbGwgYWxzbyBhZGQgYSBjYXB0aW9uIHdpdGggYSBsaW5rIHRvIHRoZSBvcmlnaW5hbCBkYXRhIHVzaW5nIHRoZSBgdGFncygpYCBhbmQgYHdpdGhUYWdzKClgIGZ1bmN0aW9ucyBvZiB0aGUgYGh0bWx0b29sc2AgcGFja2FnZS4gRGlmZmVyZW50IG9wdGlvbnMgZm9yIHR5cGVzIG9mIHRhZ3MgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIHRoZSBgJGAuCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI2MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAidGFncy5wbmciKSkKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KRFQ6OnJlbmRlckRhdGFUYWJsZSh7CiAgRFQ6OmRhdGF0YWJsZShEVF90YWJsZSwKICAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbigKICAgICAgICAgICAgICAgICAgc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IHRleHQtYWxpZ246IExlZnQ7JywKICAgICAgICAgICAgICAgICAgaHRtbHRvb2xzOjp3aXRoVGFncygKICAgICAgICAgICAgICAgICAgICBkaXYoSFRNTCgnPGEgaHJlZj0iaHR0cHM6Ly93d3cuY2hkcy51cy9zc2RiL2RhdGFzZXQvKSI+Q2xpY2sgaGVyZSB0byBiZSByZWRpcmVjdGVkIHRvIGEgcGFnZSB3aGVyZSB0aGlzIGRhdGEgY2FuIGJlIGRvd25sb2FkZWQuPC9hPicpKSkpLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoYXV0b1dpZHRoID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSAnNDUwcHgnKSkKfSkKYGBgCgoKV2Ugd2lsbCBhbHNvIGFkZCBhbm90aGVyIGltYWdlIHRvIHRoZSBjb2x1bW4gb24gdGhlIHJpZ2h0LCBvdmVyYWxsIHRoZSBjb2RlIGxvb2tzIGxpa2UgdGhpczoKCgpgYGAKQ29sdW1uIHtkYXRhLXdpZHRoPTcwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMKClRoZSBkYXRhIHVzZWQgaW4gdGhpcyBkYXNoYm9hcmQgaXMgZnJvbSB0aGUgWyoqQ2VudGVyIGZvciBIb21lbGFuZCBEZWZlbnNlIGFuZCBTZWN1cml0eSAoQ0hEUykqKl0oQ2VudGVyIGZvciBIb21lbGFuZCBEZWZlbnNlIGFuZCBTZWN1cml0eSAoQ0hEUykpIFsqKkstMTIgU2hvb2wgU2hvb3RpbmcgRGF0YWJhc2UqKl0oaHR0cHM6Ly93d3cuY2hkcy51cy9zc2RiL2RhdGFzZXQvKS4gCgpUaGVpciBtZXRob2RzIGZvciBpZGVudGlmeWluZyBhbmQgYXV0aGVudGljYXRpbmcgaW5jaWRlbnRzIGFyZSBvdXRsaW5lZCBbaGVyZV0oaHR0cHM6Ly93d3cuY2hkcy51cy9zc2RiL21ldGhvZHMvKS4KCkFjY29yZGluZyB0byB0aGVpciB3ZWJzaXRlOiAKCj4qIlRoaXMgZGF0YWJhc2Ugd2FzIGRldmVsb3BlZCBmcm9tIG9wZW4tc291cmNlIGluZm9ybWF0aW9uIGFuZCBtYXkgaW5jbHVkZSByZXBvcnRpbmcgZXJyb3JzLiIqCgoqKioKCgoKJycne3IsIGVjaG89RkFMU0V9CiMgQ3JlYXRlIHRoZSBEVCB0YWJsZSBmaXJzdApEVF90YWJsZSA8LSBzaG9vdGluZ19kYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoRGF0ZSwKICAgICAgICAgICAgICAgIFNjaG9vbCwKICAgICAgICAgICAgICAgIENpdHksCiAgICAgICAgICAgICAgICBTdGF0ZSwKICAgICAgICAgICAgICAgIGBLaWxsZWQgKGluY2x1ZGVzIHNob290ZXIpYCwKICAgICAgICAgICAgICAgIGBOYXJyYXRpdmUgKERldGFpbGVkIFN1bW1hcnkvIEJhY2tncm91bmQpYCkgJT4lCiAgcmVuYW1lKCJEZWF0aHMiID0gYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgKSAlPiUKICByZW5hbWUoIk5hcnJhdGl2ZSIgPSBgTmFycmF0aXZlIChEZXRhaWxlZCBTdW1tYXJ5LyBCYWNrZ3JvdW5kKWApCicnJwoKCgonJyd7ciwgZWNobz1GQUxTRX0KRFQ6OnJlbmRlckRhdGFUYWJsZSh7CiAgRFQ6OmRhdGF0YWJsZShEVF90YWJsZSwKICAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbigKICAgICAgICAgICAgICAgICAgc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IHRleHQtYWxpZ246IExlZnQ7JywKICAgICAgICAgICAgICAgICAgaHRtbHRvb2xzOjp3aXRoVGFncygKICAgICAgICAgICAgICAgICAgICBkaXYoSFRNTCgnPGEgaHJlZj0iaHR0cHM6Ly93d3cuY2hkcy51cy9zc2RiL2RhdGFzZXQvKSI+Q2xpY2sgaGVyZSB0byBiZSByZWRpcmVjdGVkIHRvIGEgcGFnZSB3aGVyZSB0aGlzIGRhdGEgY2FuIGJlIGRvd25sb2FkZWQuPC9hPicpKSkpLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoYXV0b1dpZHRoID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSAnNDUwcHgnKSkKfSkKJycnCgpDb2x1bW4ge2RhdGEtd2lkdGg9MzB9Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIwoKJycne3IsIGVjaG89RkFMU0UsIGZpZy5jYXA9IltQaG90b2dyYXBoIGJ5IFJ1YsOpbiBSb2RyaWd1ZXpdKGh0dHBzOi8vdW5zcGxhc2guY29tL3Bob3Rvcy9JWFR2bk9PU1R5VSkifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAicnViZW4tcm9kcmlndWV6LUlYVHZuT09TVHlVLXVuc3BsYXNoLmpwZyIpKQonJycKYGBgCgoKIyMjIFN0YXRpc3RpY3MgcGFnZQoKTm93IExldCdzIGNyZWF0ZSBhIHBhZ2UgZm9yICoqVVMgU3RhdGlzdGljcyoqIHdlIHdvdWxkIGxpa2UgdG8gc2hhcmUuIFRoaXMgdGltZSB3ZSB3aWxsIHVzZSAgdGhlIGAudGFic2V0YCBhbmQgYC50YWJzZXQtZmFkZWAgb3B0aW9ucyBzcGVjaWZpZWQgZm9yIG91ciBmaXJzdCBjb2x1bW4uIAoKCmBgYApVUyBTdGF0aXN0aWNzIHtkYXRhLWljb249ImZhLWZsYWcifQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAoKCkNvbHVtbiB7ZGF0YS13aWR0aD03MCAudGFic2V0IC50YWJzZXQtZmFkZX0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGAKCkFmdGVyIGhhdmluZyBzcGVjaWZpZWQgdGhlIGAudGFic2V0YCBhbmQgYC50YWJzZXQtZmFkZWAgb3B0aW9ucywgd2UgY2FuIGNyZWF0ZSBuZXcgdGFicyBpbiB0aGUgc2FtZSB3YXkgd2Ugd291bGQgYWRkIGVsZW1lbnRzIHRvIG91ciBkYXNoYm9hcmQgd2l0aCB0aGUgYCMjI2Agc3ludGF4LiBKdXN0IGxpa2UgaW4gdGhpcyBleGFtcGxlOgoKYGBge3IsIGVjaG89RkFMU0UsIG91dC53aWR0aD0iNjAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiAsICJ0YWIucG5nIikpCmBgYAoKTGV0J3MgbWFrZSBhIHRhYiBmb3IgeWVhcmx5IHNob290aW5nIGV2ZW50cyBhbmQgZGVhdGhzLCBhIHRhYiBmb3IgY3VtdWxhdGl2ZSBzaG9vdGluZyBldmVudHMgYW5kIGRlYXRocywgYW5kIGEgdGFiIGFib3V0IHRoZSBudW1iZXIgb2YgZGVhdGhzIHBlciBzaG9vdGluZy4gSW4gZWFjaCB0YWIgd2Ugd2lsbCBpbmNsdWRlIHRoZSBjb2RlIGZvciB0aGUgcGxvdHMgdGhhdCB3ZSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC4gCgpgYGAKIyMjIFllYXJseSBEZWF0aHMKCicnJ3tyfQpzaG9vdGluZ19kYXRhX2dlb2NvZGVkX3VzIDwtIHNob290aW5nX2RhdGFfZ2VvY29kZWQgJT4lCiAgICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyVZIikpICU+JQogICAgbXV0YXRlKERhdGVfeWVhciA9IHllYXIoRGF0ZSkpICU+JQogICAgZ3JvdXBfYnkoRGF0ZV95ZWFyKSAlPiUKICAgIGNvdW50KCkgJT4lCiAgICB1bmdyb3VwKCkKc3RhcnQgPC0gMTk3MAplbmQgPC0gMjAyMApzaG9vdGluZ19kYXRhX2dlb2NvZGVkX3VzICU+JQogICAgZ2dwbG90KGFlcyh4ID0gRGF0ZV95ZWFyLCB5ID0gbikpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImJsYWNrIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoc3RhcnQtMSwgZW5kKzEpKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgbGFicyh0aXRsZSA9ICJZZWFybHkgRGVhdGhzIEF0dHJpYnV0YWJsZSB0byBTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgc3VidGl0bGUgPSAiVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgIHggPSAiU2Nob29sIFNob290aW5ncyIsCiAgICAgICAgIHkgPSAiIikKJycnCgojIyMgWWVhcmx5IEN1bXVsYXRpdmUgRGVhdGhzCgonJyd7cn0Kc3RhcnQgPC0gMTk3MAplbmQgPC0gMjAyMApzaG9vdGluZ19kYXRhX2dlb2NvZGVkX3VzMiA8LSBzaG9vdGluZ19kYXRhX2dlb2NvZGVkICU+JQogICAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlbS8lZC8lWSIpKSAlPiUKICAgIG11dGF0ZShEYXRlX3llYXIgPSB5ZWFyKERhdGUpKSAlPiUKICAgIGdyb3VwX2J5KERhdGVfeWVhcikgJT4lCiAgICBzdW1tYXJpemUoTiA9IG4oKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBjb21wbGV0ZShEYXRlX3llYXIgPSBzZXEoc3RhcnQsZW5kLGJ5PTEpKSAlPiUKICAgIG11dGF0ZShuX2N1bXN1bSA9IGN1bXN1bShOKSkKc2hvb3RpbmdfZGF0YV9nZW9jb2RlZF91czIgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBEYXRlX3llYXIsIHkgPSBuX2N1bXN1bSkpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImJsYWNrIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoc3RhcnQtMSwgZW5kKzEpKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgbGFicyh0aXRsZSA9ICJZZWFybHkgQ3VtdWxhdGl2ZSBEZWF0aHMgQXR0cmlidXRhYmxlIHRvIFNjaG9vbCBTaG9vdGluZ3MiLAogICAgICAgICBzdWJ0aXRsZSA9ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgeCA9ICJTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgeSA9ICIiKQonJycKCiMjIyBEZWF0aHMgcGVyIFNob290aW5nCgonJyd7cn0Kc2hvb3RpbmdfZGF0YV9nZW9jb2RlZF91czMgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPiUKICAgIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJW0vJWQvJVkiKSkgJT4lCiAgICBtdXRhdGUoRGF0ZV95ZWFyID0geWVhcihEYXRlKSkgJT4lCiAgICBncm91cF9ieShgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWApICU+JQogICAgc3VtbWFyaXplKE4gPSBuKCkpCnNob290aW5nX2RhdGFfZ2VvY29kZWRfdXMzICU+JQogICAgZ2dwbG90KGFlcyh4ID0gYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgLCB5ID0gTikpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwxMCwgYnkgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDAsMTAsIGJ5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIGxhYnModGl0bGUgPSAiRGVhdGhzIHBlciBTY2hvb2wgU2hvb3RpbmciLAogICAgICAgICBzdWJ0aXRsZSA9ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgeCA9ICJTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgeSA9ICIiKQonJycKYGBgCgpXZSBpbmNsdWRlIGEgY29sdW1uIGZvciB2YWx1ZSBib3hlcy4KCmBgYApDb2x1bW4ge2RhdGEtd2lkdGg9MzAwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIApgYGAKCldlIGNyZWF0ZSB0aGUgZmlyc3QgdmFsdWUgYm94LiBXZSB3YW50IHRvIGRpc3BsYXkgc29tZSBpbXBvcnRhbnQgc3RhdGlzdGljcywgaW1wb3J0YW50bHk6CgorIFdvdW5kZWQKKyBEZWF0aHMKKyBTaG9vdGluZyBDb21wbGV0ZWQvQXR0ZW1wdGVkIFN1aWNpZGUKKyBNZWRpYW4gU2hvdHMgRmlyZWQKKyBEZWF0aHMsIFNob290ZXIgd2FzIE9ubHkgVmljdGltCisgVXNlIG9mIGEgU2luZ2xlIEhhbmRndW4KCmBgYAojIyMgKipXb3VuZGVkKioKICAgIAonJyd7cn0KdmFsdWVCb3goc3VtKHNob290aW5nX2RhdGFfZ2VvY29kZWQkV291bmRlZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgY29sb3IgPSAid2hpdGUiKQonJycKYGBgCgpXZSBjcmVhdGUgdGhlIHJlbWFpbmluZyB2YWx1ZSBib3hlcwoKYGBgCiMjIyAqKkRlYXRocyoqCgonJyd7cn0KdmFsdWVCb3goc3VtKHNob290aW5nX2RhdGFfZ2VvY29kZWQkYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBjb2xvciA9ICJ3aGl0ZSIpCicnJwoKIyMjICoqU2hvb3RlciBDb21wbGV0ZWQvQXR0ZW1wdGVkIFN1aWNpZGUqKgoKJycne3J9CiMgdGhpcyBuZWVkcyB0byBiZSB3cmFuZ2xlZCBpbiB0aGUgcmVndWxhciBkYXRhCnN1aWNpZGUgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPiUKICBtdXRhdGUoYFN1aWNpZGUgKG9yIGF0dGVtcHRlZCBzdWljaWRlKSBieSBTaG9vdGVyIChZL04pYCA9IGNhc2Vfd2hlbihgU3VpY2lkZSAob3IgYXR0ZW1wdGVkIHN1aWNpZGUpIGJ5IFNob290ZXIgKFkvTilgID09ICJZZXMiIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gRkFMU0UpKSAlPiUKICBwdWxsKGBTdWljaWRlIChvciBhdHRlbXB0ZWQgc3VpY2lkZSkgYnkgU2hvb3RlciAoWS9OKWApCgpzdWljaWRlIDwtIHN1bShzdWljaWRlLAogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpIC8gbGVuZ3RoKHN1aWNpZGUpCgojIHZhbHVlQm94KAojICAgcGFzdGUoCiMgICAgIHJvdW5kKAojICAgICAgIG1lYW4oc3VpY2lkZSwKIyAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKiAxMDAsCiMgICAgICAgMiksCiMgICAgICIlIiksCiMgICBjb2xvciA9ICJ3aGl0ZSIpCgp2YWx1ZUJveCgKICBwYXN0ZSgKICAgIHJvdW5kKHN1aWNpZGUgKiAxMDAsCiAgICAgICAgICAyKSwKICAiJSIpLAogIGNvbG9yID0gIndoaXRlIikKJycnCgojIyMgKipNZWRpYW4gU2hvdHMgRmlyZWQqKgoKJycne3J9CnZhbHVlQm94KAogIHJvdW5kKAogIG1lZGlhbihzaG9vdGluZ19kYXRhX2dlb2NvZGVkJGBOdW1iZXIgb2YgU2hvdHMgRmlyZWRgLAogICAgICBuYS5ybSA9IFRSVUUpLAogIDIpLAogIGNvbG9yID0gIndoaXRlIikKJycnCgojIyMgKipEZWF0aHMsIFNob290ZXIgd2FzIE9ubHkgVmljdGltKioKCicnJ3tyfQp2YWx1ZUJveCgKICBwYXN0ZSgKICAgIGFzLmNoYXJhY3RlcigKICAgIHJvdW5kKAogICAgICAxMDAgKiAoc3VtKAogICAgaWZlbHNlKHNob290aW5nX2RhdGFfZ2VvY29kZWQkYFN1aWNpZGUgKFNob290ZXIgd2FzIG9ubHkgdmljdGltKSBZL04vIE4vQWAgPT0gIlkiLAogICAgICAgICAgICAgICAgVFJVRSwKICAgICAgICAgICAgICAgIEZBTFNFKSwgbmEucm0gPSBUUlVFKQogICAgLwogICAgICBzdW0oc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCRgS2lsbGVkIChpbmNsdWRlcyBzaG9vdGVyKWAsIG5hLnJtID0gVFJVRSkpLAogICAgMikpLCAiJSIpLAogIGNvbG9yID0gIndoaXRlIikKJycnCgojIyMgKipVc2Ugb2YgYSBTaW5nbGUgSGFuZGd1bioqCgonJyd7cn0KdmFsdWVCb3goCiAgcGFzdGUoCiAgICBhcy5jaGFyYWN0ZXIoCiAgICByb3VuZCgKICAgICAgMTAwICogKHN1bSgKICAgIGlmZWxzZShzaG9vdGluZ19kYXRhX2dlb2NvZGVkJGBGaXJlYXJtIFR5cGVgID09ICJSaWZsZSIsCiAgICAgICAgICAgICAgICBUUlVFLAogICAgICAgICAgICAgICAgRkFMU0UpLCBuYS5ybSA9IFRSVUUpCiAgICAvCiAgICAgIGxlbmd0aChzaG9vdGluZ19kYXRhX2dlb2NvZGVkJGBGaXJlYXJtIFR5cGVgKSksCiAgICAyKSksICIlIiksCiAgY29sb3IgPSAid2hpdGUiKQonJycKYGBgCgojIyMgTGVhZmxldAoKYExlYWZsZXRgIHdpZGdldHMgY2FuIGJlIGluY2x1ZGVkIHdpdGhpbiBkYXNoYm9hcmRzIGNyZWF0ZWQgd2l0aCBgZmxleGRhc2hib2FyZGAuCgpgTGVhZmxldGAgd29ya3MgYnkgcHJvdmlkZWQgYnkgYWRkaW5nIGJhc2UgZGF0YSAoc3VjaCBhcyBhIG1hcCkgYW5kIHRoZW4gYWRkaW5nIG1hcmtlcnMgaWYgZGVzaXJlZCBpbiBsYXllcnMuIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGhvdyBgZ2dwbG90YCBmdW5jdGlvbnMgKHB1biBpbnRlbmRlZCkuCgpUaGUgbGF5ZXJzIGRpc3BsYXllZCBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBhIHNvcnQgb2YgbGVnZW5kLiBEZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbGF5ZXJzLCBzb21lIGluZm9ybWF0aW9uIG1heSBiZSBkaXNwbGF5ZWQgbXV0dWFsbHkgZXhjbHVzaXZlIG9mIHRoZSBvdGhlciBsYXllcnM7IG90aGVyIGxheWVycyAoc3VjaCBhcyBjaXJjbGVzL2dlbmVyYWwgbWFya2VycykgY2FuIGJlIHRvZ2dsZWQgb24gYW5kIG9mZi4gCgpBIG1pbmltYXAgY2FuIGJlIGFkZGVkLgoKVGhlIGxheWVycyBkaXNwbGF5ZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGZpcnN0IG9wZW5lZCBjYW4gYWxzbyBiZSBjb250cm9sbGVkLiBXZSBkaWQgdGhhdCBpbiB0aGlzIGNhc2Ugc3R1ZHkuIAoKYGdyb3Vwc2AgaW4gbGVhZmxldCBjYW4gYmUgdGhvdWdodCBvZiBhcyBsYXllci1zcGVjaWZpYyBJRHMgdGhhdCBjcmVhdGUgbGFiZWxzIGZvciBsZWdlbmRzIGFuZCBhbGxvdyBzcGVjaWZpYyBsYXllcnMgdG8gYmUgcmVmZXJyZWQgdG8gaW4gc2VwYXJhdGUgZnVuY3Rpb25zLiAKCklmIHdlIGNhbGxlZCBhIGdyb3VwICJMYXllciAxIiBhbmQgdGhlbiBpbiBhIHN1YnNlcXVlbnQgbGF5ZXIgcmVmZXJyZWQgdG8gIkxheWVyIDEiLCBgTGVhZmxldGAgd2lsbCBjb3JyZWN0bHkgaWRlbnRpZnkgd2hpY2ggbGF5ZXIgaXMgYmVpbmcgcmVmZXJlbmNlZC4KCmBMZWFmbGV0YCBjYW4gcmVxdWlyZSBhIGxvdCBvZiBjb21wdXRhdGlvbmFsIHBvd2VyOyB0aGlzIGNhbiBoYXZlIGFuIGltcGFjdCBvbiB0aGUgdHlwZXMgb2YgbWFwcyBwcm9kdWNlZC4KCkNsdXN0ZXJpbmcgb3B0aW9ucyBjYW4gYmUgYXBwbGllZCB0byBjaXJjbGVzL21hcmtlcnMuIFNvbWUgZXhhbXBsZXMgb2YgdGhpcyBjYW4gYmUgZm91bmQgb24gdGhlIGJvdHRvbSBvZiBbdGhpcyBwYWdlXShodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2xlYWZsZXQvbWFya2Vycy5odG1sKS4KCmBgYAojIyMgU3BlY2lmaWVkIFRpdGxlCmBgYAoKSWYgdGhlIHRpdGxlIGlzIHVuc3BlY2lmaWVkLi4uCgpgYGAKIyMjCmBgYAoKdGhlIGdyYXBoaWNzIHdpbGwgYmUgcmVjb2duaXplZCBidXQgbm8gdGl0bGUgd2lsbCBiZSBzaG93biBmb3IgdGhhdCBwYXJ0aWN1bGFyIGdyYXBoaWMuCgpgZmlnLXdpZHRoYCBhbmQgYGZpZy5oZWlnaHRgIG9wZXJhdGUgaW4gdGhlIGNvZGUgY2h1bmsgb3B0aW9ucy4gCgoKIyMgUkEgTk9URVMKCgpDb25zdWx0IHRoaXMgZG9jdW1lbnQgZm9yIGEgZ2VuZXJhbCBvdmVydmlldzoKCisgY2FzZS1zdHVkeS1zdHJ1Y3R1cmUtTU8tbm90ZXMKClRoZXJlIGFyZSBzZXZlcmFsIGRhdGFzZXRzIGludm9sdmVkIGluIHRoaXMgY2FzZSBzdHVkeQoKKyBSYXcgZGF0YXNldCAocmF3X2RhdGEvSy0xMiBTU0RCIChQdWJsaWMpIC0gSy0xMiBTU0RCIChQdWJsaWMpIExpbmtlZC5jc3YpCisgR2VvY29kZWQgZGF0YXNldCAgKHByb2Nlc3NlZF9kYXRhL3Nob290aW5nX2RhdGEuY3N2KQorIFdyYW5nbGVkIGRhdGFzZXQgKHByb2Nlc3NlZF9kYXRhL3Nob290aW5nX2RhdGFfd3JhbmdsZWQpCgpUaGlzIGRvY3VtZW50IHVzZXMgdGhlIGdlb2NvZGVkIGRhdGFzZXQgdG8gcHJvZHVjZSB0aGUgd3JhbmdsZWQgZGF0YXNldC4KClRoZSB3cmFuZ2xlZCBkYXRhc2V0IGlzIHRoZW4gdXNlZCB0byBwcm9kdWNlIHRoZSBkYXNoYm9hcmQgaW4gdGhlIG90aGVyIGRvY3VtZW50LgoKClRoZSBnb2Vjb2RpbmcgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGlzIGNhc2Ugc3R1ZHkgdG9vayBhcHByb3hpbWF0ZWx5IDEuNS0yIGhvdXJzIG9uIGEgTWFjYm9vayBBaXIgKDIwMTUpLiAKCgoKIyMgUkEgQ29kZQoKV2Ugd2lsbCBlbXBsb3kgdGhlIGZvbGxvd2luZyBsYXlvdXQgZm9yIHRoZSBkYXNoYm9hcmQuCgpSTWFya2Rvd24gRGFzaGJvYXJkIFN0cnVjdHVyZQoKKyBJY29uICg0OCB4IDQ4KQorIFRoZSBEYXRhCisgQ29sdW1uIDE6IEludGVyYWN0aXZlIFRhYmxlCisgQ29sdW1uIDI6IFBob3RvCisgVVMgU3RhdGlzdGljcworIENvbHVtbiAxIAorIFllYXJseSBEZWF0aHMKKyBZZWFybHkgQ3VtdWxhdGl2ZSBEZWF0aHMKKyBEZWF0aHMgcGVyIFNob290aW5nCisgQ29sdW1uIDIKKyBXb3VuZGVkCisgRGVhdGhzCisgU2hvb3RpbmcgQ29tcGxldGVkL0F0dGVtcHRlZCBTdWljaWRlCisgTWVkaWFuIFNob3RzIEZpcmVkCisgRGVhdGhzLCBTaG9vdGVyIHdhcyBPbmx5IFZpY3RpbQorIFVzZSBvZiBhIFNpbmdsZSBIYW5kZ3VuCisgU3RhdGUgU3RhdGlzdGljcworIFNpZGViYXIKKyBDb2x1bW4gMQorIFllYXJseSBEZWF0aHMKKyBZZWFybHkgQ3VtdWxhdGl2ZSBEZWF0aHMKKyBEZWF0aHMgcGVyIFNob290aW5nCisgTWFwCisgWm9vbSAoKykKKyBab29tICgtKQorIExheWVyIENvbnRyb2xzCisgUHJvdmlkZXIgVGlsZXMKKyBDaXJjbGUgTWFya2VycworIE1pbmktbWFwCisgQWJvdXQKKyBDb2x1bW4gMQorIERpc2NsYWltZXIKKyBIb3cgZG8gSSB1c2UgdGhpcyBkYXNoYm9hcmQ/CisgRG9lcyBPcGVuIENhc2UgU3R1ZGllcyBoYXZlIG1vcmUgcmVzb3VyY2VzIEkgY2FuIGFjY2VzcyB0byBsZWFybiBhYm91dCBjcmVhdGluZyB0aGlzIGRhc2hib2FyZD8KKyBDb2x1bW4gMjogUGhvdG8KKyBUdXRvcmlhbAorIFN0ZXAgMTogTG9hZCB0aGUgYGZsZXhkYXNoYm9hcmRgIHBhY2thZ2UKKyBTdGVwIDI6IENyZWF0ZSBhbmQgYFJNRGAgZG9jdW1lbnQKKyBTdGVwIDM6IENyZWF0ZSBhbiBhcHByb3ByaWF0ZSBgWUFNTGAuCisgU3RlcCA0OiBEZXNpZ24gdGhlIGxheW91dCBvZiB0aGUgZGFzaGJvYXJkLgorIFN0ZXAgNTogQWRkIGNvbnRlbnQgdG8gdGhlIGRhc2hib2FyZC4KKyBIb3RsaW5lCisgV2FybmluZyBTaWducworIFJlc3BvbnNlIHRvIFdhcm5pbmcgU2lnbnMKKyBTb3VyY2UgQ29kZQoKCgoKIyMjCgoKCgoKCgpXZSB0aGVuIGNyZWF0ZSB0aGUgbmV4dCBwYWdlLCAqKlN0YXRlIFN0YXRpc3RpY3MqKiAKCmBgYApTdGF0ZSBTdGF0aXN0aWNzIHtkYXRhLWljb249ZmEtZmxhZy1jaGVja2VyZWR9Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCgpDb2x1bW4gey5zaWRlYmFyIGRhdGEtd2lkdGg9MjUwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKJycne3J9CnNlbGVjdElucHV0KCJzdGF0ZV9zZWxlY3RlZCIsIGxhYmVsID0gIlNlbGVjdCBhIHN0YXRlIHRvIGV4cGxvcmU6IiwKICAgICAgICAgICAgY2hvaWNlcyA9IHVuaXF1ZShtYXBfZGF0YSgic3RhdGUiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihyZWdpb24hPSJkaXN0cmljdCBvZiBjb2x1bWJpYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVsbChyZWdpb24pKSAlPiUKICAgICAgICAgICAgICBzdHJfdG9fdGl0bGUoKSwgc2VsZWN0ZWQgPSAiTWFyeWxhbmQiKQonJycKCkNvbHVtbiB7ZGF0YS13aWR0aD03NTAgLnRhYnNldCAudGFic2V0LWZhZGV9Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMgWWVhcmx5IERlYXRocwoKJycne3J9CnJlbmRlclBsb3QoewogIHN0YXJ0IDwtIDE5NzAKICBlbmQgPC0gMjAyMAogIHN0YXRlX2RmIDwtIGFzX3RpYmJsZShjYmluZChzdGF0ZS5hYmIsIHN0YXRlLm5hbWUpKQogIHNob290aW5nX2RhdGFfZ2VvY29kZWQgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZCAlPiUKICAgIHJlbmFtZSgiU3RhdGVfYWJiIiA9IFN0YXRlKSAlPiUKICAgIGxlZnRfam9pbihzdGF0ZV9kZiwgYnkgPSBjKCJTdGF0ZV9hYmIiID0gInN0YXRlLmFiYiIpKSAlPiUKICAgIHJlbmFtZSgiU3RhdGUiID0gc3RhdGUubmFtZSkgJT4lCiAgICBtdXRhdGUoU3RhdGUgPSBzdHJfdG9fdGl0bGUodG9sb3dlcihTdGF0ZSkpKSAlPiUKICAgIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJW0vJWQvJVkiKSkgIyB0aGlzIG11c3QgYmUgYXBwbGllZCB0byB3cmFuZ2xpbmcKICBzaG9vdGluZ19kYXRhX2dlb2NvZGVkX2YgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZFtzaG9vdGluZ19kYXRhX2dlb2NvZGVkJFN0YXRlID09IGlucHV0JHN0YXRlX3NlbGVjdGVkLCBdCiAgc2hvb3RpbmdfZGF0YV9nZW9jb2RlZF9mIDwtIHNob290aW5nX2RhdGFfZ2VvY29kZWRfZiAlPiUKICAgIG11dGF0ZShEYXRlX3llYXIgPSB5ZWFyKERhdGUpKSAlPiUKICAgIGdyb3VwX2J5KERhdGVfeWVhcikgJT4lCiAgICBjb3VudCgpICU+JQogICAgdW5ncm91cCgpCiAgc2hvb3RpbmdfZGF0YV9nZW9jb2RlZF9mICU+JQogICAgZ2dwbG90KGFlcyh4ID0gRGF0ZV95ZWFyLCB5ID0gbikpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImJsYWNrIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcShzdGFydCwgZW5kLCBieSA9IDUpLAogICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoc3RhcnQtMSwgZW5kKzEpKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgbGFicyh0aXRsZSA9ICJTdGF0ZXdpZGUgU2Nob29sIFNob290aW5ncyIsCiAgICAgICAgIHN1YnRpdGxlID0gaW5wdXQkc3RhdGVfc2VsZWN0ZWQsCiAgICAgICAgIHggPSAiWWVhcmx5IERlYXRocyBBdHRyaWJ1dGFibGUgdG8gU2Nob29sIFNob290aW5ncyIsCiAgICAgICAgIHkgPSAiIikKfSkKJycnCgojIyMgWWVhcmx5IEN1bXVsYXRpdmUgRGVhdGhzCgonJyd7cn0KcmVuZGVyUGxvdCh7CiAgc3RhcnQgPC0gMTk3MAogIGVuZCA8LSAyMDIwCiAgc3RhdGVfZGYyIDwtIGFzX3RpYmJsZShjYmluZChzdGF0ZS5hYmIsIHN0YXRlLm5hbWUpKQogIHNob290aW5nX2RhdGFfZ2VvY29kZWQyIDwtIHNob290aW5nX2RhdGFfZ2VvY29kZWQgJT4lCiAgICByZW5hbWUoIlN0YXRlX2FiYiIgPSBTdGF0ZSkgJT4lCiAgICBsZWZ0X2pvaW4oc3RhdGVfZGYyLCBieSA9IGMoIlN0YXRlX2FiYiIgPSAic3RhdGUuYWJiIikpICU+JQogICAgcmVuYW1lKCJTdGF0ZSIgPSBzdGF0ZS5uYW1lKSAlPiUKICAgIG11dGF0ZShTdGF0ZSA9IHN0cl90b190aXRsZSh0b2xvd2VyKFN0YXRlKSkpICU+JQogICAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlbS8lZC8lWSIpKSAjIHRoaXMgbXVzdCBiZSBhcHBsaWVkIHRvIHdyYW5nbGluZwogIHNob290aW5nX2RhdGFfZ2VvY29kZWRfZjIgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZDJbc2hvb3RpbmdfZGF0YV9nZW9jb2RlZDIkU3RhdGUgPT0gaW5wdXQkc3RhdGVfc2VsZWN0ZWQsIF0KICBzaG9vdGluZ19kYXRhX2dlb2NvZGVkX2YyIDwtIHNob290aW5nX2RhdGFfZ2VvY29kZWRfZjIgJT4lCiAgICBtdXRhdGUoRGF0ZV95ZWFyID0geWVhcihEYXRlKSkgJT4lCiAgICBncm91cF9ieShEYXRlX3llYXIpICU+JQogICAgc3VtbWFyaXplKE4gPSBuKCkpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgY29tcGxldGUoRGF0ZV95ZWFyID0gc2VxKHN0YXJ0LCBlbmQsIGJ5PTEpLAogICAgICAgICAgICAgZmlsbCA9IGxpc3QoTiA9IDApKSAlPiUKICAgIG11dGF0ZShuX2N1bXN1bSA9IGN1bXN1bShOKSkKICBzaG9vdGluZ19kYXRhX2dlb2NvZGVkX2YyICU+JQogICAgZ2dwbG90KGFlcyh4ID0gRGF0ZV95ZWFyLCB5ID0gbl9jdW1zdW0pKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJibGFjayIpICsKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoc3RhcnQsIGVuZCwgYnkgPSA1KSwKICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoc3RhcnQsIGVuZCwgYnkgPSA1KSwKICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKHN0YXJ0LTEsIGVuZCsxKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIGxhYnModGl0bGUgPSAiWWVhcmx5IEN1bXVsYXRpdmUgRGVhdGhzIEF0dHJpYnV0YWJsZSB0byBTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgc3VidGl0bGUgPSBpbnB1dCRzdGF0ZV9zZWxlY3RlZCwKICAgICAgICAgeCA9ICJTY2hvb2wgU2hvb3RpbmdzIiwKICAgICAgICAgeSA9ICIiKQp9KQonJycKCiMjIyBEZWF0aHMgcGVyIFNob290aW5nCgonJyd7cn0KcmVuZGVyUGxvdCh7CiAgc3RhdGVfZGYzIDwtIGFzX3RpYmJsZShjYmluZChzdGF0ZS5hYmIsIHN0YXRlLm5hbWUpKQogIHNob290aW5nX2RhdGFfZ2VvY29kZWQzIDwtIHNob290aW5nX2RhdGFfZ2VvY29kZWQgJT4lCiAgICByZW5hbWUoIlN0YXRlX2FiYiIgPSBTdGF0ZSkgJT4lCiAgICBsZWZ0X2pvaW4oc3RhdGVfZGYzLCBieSA9IGMoIlN0YXRlX2FiYiIgPSAic3RhdGUuYWJiIikpICU+JQogICAgcmVuYW1lKCJTdGF0ZSIgPSBzdGF0ZS5uYW1lKSAlPiUKICAgIG11dGF0ZShTdGF0ZSA9IHN0cl90b190aXRsZSh0b2xvd2VyKFN0YXRlKSkpCiAgc2hvb3RpbmdfZGF0YV9nZW9jb2RlZDMgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZDMgJT4lCiAgICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyVZIikpICU+JQogICAgbXV0YXRlKERhdGVfeWVhciA9IHllYXIoRGF0ZSkpICU+JQogICAgZ3JvdXBfYnkoU3RhdGUsYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgKSAlPiUKICAgIHN1bW1hcml6ZShOID0gbigpKQogIHNob290aW5nX2RhdGFfZ2VvY29kZWRfZjMgPC0gc2hvb3RpbmdfZGF0YV9nZW9jb2RlZDNbc2hvb3RpbmdfZGF0YV9nZW9jb2RlZDMkU3RhdGUgPT0gaW5wdXQkc3RhdGVfc2VsZWN0ZWQsIF0KICBzaG9vdGluZ19kYXRhX2dlb2NvZGVkX2YzICU+JQogICAgZ2dwbG90KGFlcyh4ID0gYEtpbGxlZCAoaW5jbHVkZXMgc2hvb3RlcilgLCB5ID0gTikpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwzMCwgYnkgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDAsMzAsIGJ5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMzApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIGxhYnModGl0bGUgPSAiRGVhdGhzIHBlciBTY2hvb2wgU2hvb3RpbmciLAogICAgICAgICBzdWJ0aXRsZSA9IGlucHV0JHN0YXRlX3NlbGVjdGVkLAogICAgICAgICB4ID0gIlNjaG9vbCBTaG9vdGluZ3MiLAogICAgICAgICB5ID0gIiIpCn0pCicnJwpgYGAKCldlIHRoZW4gY3JlYXRlIHRoZSAqKk1hcCoqIHBhZ2UuIAoKYGBgCkNvbHVtbiB7ZGF0YS13aWR0aD0xMDAwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgCiMjIyAKICAgIAonJyd7cn0KIyB3b3VsZCBiZSBhIGdyZWF0IGlkZWEgdG8gYWRkIGEgc2xpZGVyIGhlcmUgaWYgcG9zc2libGUKIyBnb29kIHNpdGUgZm9yIGljb25zIGh0dHBzOi8vaWNvbmFyY2hpdmUuY29tLwoKc2hvb3RpbmdfaW5mb3JtYXRpb24wIDwtIHBhc3RlKCc8ZGl2IHN0eWxlPSJoZWlnaHQ6YXV0bztsaW5lLWhlaWdodDoxZW07b3ZlcmZsb3c6dmlzaWJsZTtwYWRkaW5nOjVweDsiPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob290aW5nX2RhdGFfZ2VvY29kZWQkRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob290aW5nX2RhdGFfZ2VvY29kZWQkU2Nob29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9iPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob290aW5nX2RhdGFfZ2VvY29kZWQkYE5hcnJhdGl2ZSAoRGV0YWlsZWQgU3VtbWFyeS8gQmFja2dyb3VuZClgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIjxici8+IgopCgojIGljb25fc2V0IDwtIGljb25zKAojICAgaWNvblVybCA9IGNhc2Vfd2hlbihzaG9vdGluZ19kYXRhX2dlb2NvZGVkJGBGaXJlYXJtIFR5cGVgPT0iSGFuZGd1biIgfiAiaHR0cHM6Ly9pY29ucy5pY29uYXJjaGl2ZS5jb20vaWNvbnMvaWNvbnM4L3dpbmRvd3MtOC80OC9NaWxpdGFyeS1HdW4taWNvbi5wbmciLAojICAgICAgICAgICAgICAgICAgICAgICBzaG9vdGluZ19kYXRhX2dlb2NvZGVkJGBGaXJlYXJtIFR5cGVgPT0iUmlmbGUiIH4gImh0dHBzOi8vaWNvbnMuaWNvbmFyY2hpdmUuY29tL2ljb25zL2ljb25zOC93aW5kb3dzLTgvNDgvTWlsaXRhcnktUmlmbGUtaWNvbi5wbmciLAojICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImh0dHBzOi8vaWNvbnMuaWNvbmFyY2hpdmUuY29tL2ljb25zL2RyeWljb25zL2Flc3RoZXRpY2EtMi80OC9wYWdlLXNlYXJjaC1pY29uLnBuZyIpLAojICAgaWNvbldpZHRoID0gMjAsCiMgICBpY29uSGVpZ2h0ID0gMjAKIyApCgpsZWFmbGV0KHNob290aW5nX2RhdGFfZ2VvY29kZWQpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXIgPSBwcm92aWRlcnMkT3BlblN0cmVldE1hcCwgZ3JvdXAgPSAiT3BlblN0cmVldE1hcCIpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXIgPSBwcm92aWRlcnMkRXNyaS5Xb3JsZEltYWdlcnksIGdyb3VwID0gIkVTUkkgV29ybGQgSW1hZ2VyeSIpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXIgPSBwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSwgZ3JvdXAgPSAiVG9uZXIgTGl0ZSIpICU+JQogIGFkZENpcmNsZU1hcmtlcnMocG9wdXAgPSB+c2hvb3RpbmdfaW5mb3JtYXRpb24wLAogICAgICAgICAgICAgICAgICAgbG5nID0gfmxvbmdpdHVkZSwKICAgICAgICAgICAgICAgICAgIGxhdCA9IH5sYXRpdHVkZSwKICAgIHJhZGl1cyA9IDUsCiAgICBjb2xvciA9ICJyZWQiLAogICAgZmlsbE9wYWNpdHkgPSAwLjIsCiAgICBzdHJva2UgPSBUUlVFLAogICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygpLAogICAgZ3JvdXAgPSAiQ2lyY2xlcyIpICU+JQogICMgYWRkTWFya2VycyhsbmcgPSB+bG9uZ2l0dWRlLAogICMgICAgICAgICAgICAgICAgICBsYXQgPSB+bGF0aXR1ZGUsCiAgIyAgICAgICAgICAgIHBvcHVwID0gfnNob290aW5nX2luZm9ybWF0aW9uMCwKICAjICAgICAgICAgICAgICAgICAgaWNvbiA9IGljb25fc2V0LAogICMgICAgICAgICAgICAgICAgICBncm91cCA9ICJURVNURVIiKSAlPiUKICBhZGRNaW5pTWFwKHRpbGVzID0gcHJvdmlkZXJzJFN0YW1lbi5Ub25lciwKICAgICAgICAgICAgIHRvZ2dsZURpc3BsYXkgPSBUUlVFLAogICAgICAgICAgICAgbWluaW1pemVkID0gRkFMU0UpICU+JQogIGFkZExheWVyc0NvbnRyb2woCiAgICBiYXNlR3JvdXBzID0gYygiVG9uZXIgTGl0ZSIsCiAgICAgICAgICAgICAgICAgICAiT3BlblN0cmVldE1hcCIsCiAgICAgICAgICAgICAgICAgICAiRVNSSSBXb3JsZCBJbWFnZXJ5IiksCiAgICBvdmVybGF5R3JvdXBzID0gYygiQ2lyY2xlcyIpLAogICAgIyBvdmVybGF5R3JvdXBzID0gYygiQ2lyY2xlcyIsICJURVNURVIiKSwKICAgIG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhjb2xsYXBzZWQgPSBUUlVFKQogICkgJT4lCiAgc2V0VmlldyhsbmcgPSAtOTguMzUsIGxhdCA9IDM5LjUsIHpvb20gPSA0KQojIGhpZGVHcm91cChjKCJDaXJjbGVzIiwgIlRFU1RFUiIpKQojIG5lZWQgdG8gaml0dGVyIGNvb3JkaW5hdGVzIGJ5IGEgZmV3IG1ldGVycyBmb3IgcmVwZWF0cwonJycKYGBgCgpXZSB0aGVuIGNyZWF0ZSB0aGUgKipBYm91dCoqIHBhZ2UuCgpgYGAKQWJvdXQge2RhdGEtaWNvbj0iZmEtcXVlc3Rpb24tY2lyY2xlIn0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKCkNvbHVtbiB7ZGF0YS13aWR0aD03MDB9Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIwoKKipXaGF0IGlzIHRoZSBwdXJwb3NlIG9mIHRoaXMgZGFzaGJvYXJkPyoqCgpUaGlzIGRhc2hib2FyZCBoYXMgdHdvIHB1cnBvc2VzOgoKKyBJbGx1c3RyYXRlIHRyZW5kcyBpbiBzY2hvb2wgc2hvb3RpbmdzCisgRGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIGRhc2hib2FyZCB1c2luZyBgUmAKCioqSSB3YW50IHRvIGxlYXJuIGhvdyB0byBjcmVhdGUgYSBkYXNoYm9hcmQganVzdCBsaWtlIHRoaXMuKioKClZpc2l0IHRoZSAqVHV0b3JpYWwqIHBhZ2Ugb2YgdGhpcyBkYXNoYm9hcmQgdG8gZmlyc3QgbGVhcm4gdGhlIGJhc2ljcyBhYm91dCBidWlsZGluZyBhIGRhc2hib2FyZC4KCkF0IHRoZSBlbmQgb2YgdGhlIHR1dG9yaWFsIHdlIHByb3ZpZGUgYSBsaW5rIHRvIHRoaXMgW3N1cHBsZW1lbnRhcnkgcmVzb3VyY2UgYnkgdGhlIE9wZW4gQ2FzZSBTdHVkaWVzIHByb2plY3RdKElOQ0xVREUgTElOSyBIRVJFKS4KCldlIGhhdmUgaW5jbHVkZWQgdGhlIHNvdXJjZSBjb2RlIChzZWUgdXBwZXIgcmlnaHQtaGFuZCBjb3JuZXIpIGluIHRoaXMgZGFzaGJvYXJkIGZvciBtb3JlIGV4cGVyaWVuY2VkIGBSYCB1c2VycyBsb29raW5nIHRvIG1pbWljIHNvbWUgb2Ygd2hhdCB3ZSBkaWQgaW4gdGhpcyBkYXNoYm9hcmQgaW4gdGhlaXIgb3duLgoKKipEaXNjbGFpbWVyKioKClRoZSBwdXJwb3NlIG9mIHRoZSBbT3BlbiBDYXNlIFN0dWRpZXNdKGh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pbyl7dGFyZ2V0PSJfYmxhbmsifSBwcm9qZWN0IGlzICoqdG8gZGVtb25zdHJhdGUgdGhlIHVzZSBvZiB2YXJpb3VzIGRhdGEgc2NpZW5jZSBtZXRob2RzLCB0b29scywgYW5kIHNvZnR3YXJlIGluIHRoZSBjb250ZXh0IG9mIG1lc3N5LCByZWFsLXdvcmxkIGRhdGEqKi4KCkEgZ2l2ZW4gY2FzZSBzdHVkeSBkb2VzIG5vdCBjb3ZlciBhbGwgYXNwZWN0cyBvZiB0aGUgcmVzZWFyY2ggcHJvY2VzcywgaXMgbm90IGNsYWltaW5nIHRvIGJlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdheSB0byBhbmFseXplIGEgZ2l2ZW4gZGF0YSBzZXQsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgbWFraW5nIHBvbGljeSBkZWNpc2lvbnMgd2l0aG91dCBleHRlcm5hbCBjb25zdWx0YXRpb24gZnJvbSBzY2llbnRpZmljIGV4cGVydHMuIAoKQ29sdW1uIHtkYXRhLXdpZHRoPTMwMH0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjCgonJyd7ciwgZWNobz1GQUxTRSwgZmlnLmNhcD0iW1Bob3RvZ3JhcGggYnkgUnViw6luIFJvZHJpZ3Vlel0oaHR0cHM6Ly91bnNwbGFzaC5jb20vcGhvdG9zL0lYVHZuT09TVHlVKSIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIm5hdGhhbi1kdW1sYW8teFBIbW1WS1M4bE0tdW5zcGxhc2guanBnIikKJycnCmBgYAoKV2UgY3JlYXRlIGEgKipUdXRvcmlhbCoqIHBhZ2UgdGhhdCBsaW5rcyB0byB0aGlzIHJlc291cmNlLiAKCmBgYApUdXRvcmlhbCB7LnN0b3J5Ym9hcmQgZGF0YS1pY29uPSJmYS1saXN0LW9sIn0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAKCiMjIyAqKjEpKiogTG9hZCB0aGUgYGZsZXhkYXNoYm9hcmRgIHBhY2thZ2UuCgpJbnN0YWxsIHRoZSBwYWNrYWdlIGlmIHlvdSBkb24ndCBoYXZlIHRoZSBwYWNrYWdlIGluc3RhbGxlZCBhbHJlYWR5CgonJyd7ciwgZWNobz1UUlVFLCBldmFsPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJmbGV4ZGFzaGJvYXJkIikKaW5zdGFsbC5wYWNrYWdlcygic2hpbnkiKQonJycKCk9uY2UgaW5zdGFsbGVkLCB0aGUgcGFja2FnZSBpcyByZWFkeSB0byBiZSBsb2FkZWQgaW50byB0aGUgYFJgIGVudmlyb25tZW50LgoKJycne3IsIGVjaG89VFJVRX0KbGlicmFyeShmbGV4ZGFzaGJvYXJkKQpsaWJyYXJ5KHNoaW55KQonJycKClRoaXMgYWxsIG5lZWRzIHRvIGJlIGRvbmUgc2VwYXJhdGVseSBpbiB0aGUgYFJgIGNvbnNvbGUuCgojIyMgKioyKSoqIENyZWF0ZSBhbiBgUk1EYCBkb2N1bWVudC4gICAKCkRhc2hib2FyZHMgY2FuIGJlIGNyZWF0ZWQgd2l0aCBgZmxleGRhc2hib2FyZGAgaW4gdGhlIGBIVE1MYCBmb3JtYXQuIAoKYGZsZXhkYXNoYm9hcmRgIHVzZXMgYFJNYXJrZG93bmAgdG8gcHJvZHVjZSBkYXNoYm9hcmRzIHRoYXQgY2FuIGNvbnRhaW4gYFJgIG91dHB1dC4KClRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gaW5jbHVkZSBzZXZlcmFsIG1lZGl1bXMgaW4gb3VyIGRhc2hib2FyZCBzdWNoIGFzIHBsb3RzIGNyZWF0ZWQgd2l0aCBgZ2dwbG90YCBvciBtYXBzIGNyZWF0ZWQgd2l0aCBgbGVhZmxldGAuCiAgICAKIyMjICoqMykqKiBDcmVhdGUgYW4gYXBwcm9wcmlhdGUgYFlBTUxgLgoKVGhlIHVzZSBvZiBgZmxleGRhc2hib2FyZGAgYWx0ZXJzIHRoZSB3YXkgYFJNYXJrZG93bmAgZG9jdW1lbnRzIGZ1bmN0aW9uLiBUaGVzZSBhbHRlcmVkIGZ1bmN0aW9ucyBhcmUgbGFyZ2VseSBkZXBlbmRlbnQgb24gdGhlIG1ldGFkYXRhIHdlIHVzZSB0byBwcm9kdWNlIHRoZSBkYXNoYm9hcmQuIE1ldGFkYXRhIGZvciB0aGUgZGFzaGJvYXJkIGNhbiBiZSBjb25maWd1cmVkIGluIHRoZSBgWUFNTGAgb2YgdGhlIGBSTURgLiAKCkFuIGBIVE1MYCBkb2N1bWVudCBjcmVhdGVkIHdpdGggYFJNYXJrZG93bmAgaW5jbHVkZXMgYSBgWUFNTGAgdGhhdCBpcyBzb21lIHZhcmlhdGlvbiBvZiB0aGlzOgoKJycnCi0tLQp0aXRsZTogIlVudGl0bGVkIgphdXRob3I6ICJNaWNoYWVsIE9udGl2ZXJvcyIKZGF0ZTogIjgvMTIvMjAyMCIKb3V0cHV0OiBodG1sX2RvY3VtZW50Ci0tLQonJycKCldlIHVzZWQgdGhlIGZvbGxvd2luZyBgWUFNTGAgZm9yIHRoaXMgZGFzaGJvYXJkOgoKJycnCm91dHB1dDogCiAgZmxleGRhc2hib2FyZDo6ZmxleF9kYXNoYm9hcmQ6CiAgICBsb2dvOiBodHRwczovL2ljb25zLmljb25hcmNoaXZlLmNvbS9pY29ucy9pY29uczgvd2luZG93cy04LzQ4L1Byb2dyYW1taW5nLURhc2hib2FyZC1pY29uLnBuZwogICAgdGhlbWU6IHJlYWRhYmxlCiAgICBvcmllbnRhdGlvbjogY29sdW1ucwogICAgc291cmNlOiBlbWJlZAogICAgdmVydGljYWxfbGF5b3V0OiBmaWxsCnJ1bnRpbWU6IHNoaW55CicnJwoKV2UgaW50cm9kdWNlIGFuIGljb24sIHByb3ZpZGUgYSB0aGVtZSB3aXRoIGEgY29sb3Igc2NoZW1lLCBkZWZpbmUgdGhlIG9yaWVudGF0aW9uIChhbmQgdGh1cyBvcmRlcikgb2YgY29kZWQgb3V0cHV0LCBpbmNsdWRlIHRoZSBjb2RlIHVzZWQsIGxpbWl0IHNjcm9sbGluZywgYW5kIGFsbG93IGBzaGlueWAgd2lkZ2V0cyB0byBiZSB1c2VkLgoKIyMjICoqNCkqKiBEZXNpZ24gdGhlIGxheW91dCBvZiB0aGUgZGFzaGJvYXJkLgoKRGFzaGJvYXJkcyBhcmUgaW5oZXJlbnRseSB2aXN1YWwsIG1ha2luZyB0aGlzIHN0ZXAgdGhlIG1vc3QgdGltZSBpbnRlbnNpdmUgYWZ0ZXIgY29udGVudCBjcmVhdGlvbi4gV2UgbmVlZCB0byBwcmVzZW50IHRoZSBkYXRhIGluIGEgd2F5IHRoYXQgaXMgYm90aCBtZWFuaW5nIGFuZCB2aXN1YWxseSBhcHBlYWxpbmcuCgpPbiB0aGlzIGRhc2hib2FyZCwgd2Ugd2FudGVkIHRvIHByZXNlbnQgc3RhdGljIHBsb3RzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGFuZCBvZiBpbmRpdmlkdWFsIHN0YXRlcy4gV2UgYWxzbyB3YW50ZWQgdG8gZGlzcGxheSB0aGUgbG9jYXRpb25zIG9mIHNjaG9vbCBzaG9vdGluZ3MgYW5kIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBzY2hvb2wgc2hvb3RpbmdzLiBBc2lkZSBmcm9tIGJlaW5nIGEgZGFzaGJvYXJkLCB3ZSB3YW50ZWQgdG8gY3JlYXRlIGFuIGVkdWNhdGlvbmFsIHJlc291cmNlIHRoYXQgd2FzIHJlcHJvZHVjaWJsZSBmb3Igb3RoZXJzLiBMYXN0bHksIGFzIGEgc2Vuc2l0aXZlIHRvcGljLCB3ZSB3YW50ZWQgdG8gcmFpc2UgYXdhcmVuZXNzIGFuZCBwcm92aWRlIGluZm9ybWF0aW9uIHRoYXQgY291bGQgaGVscCBvdGhlcnMgYWN0LgoKR2l2ZW4gdGhlc2UgZ29hbHMsIHdlIGRlY2lkZWQgb24gdGhlIGZvbGxvd2luZyBwYWdlIGxheW91dDoKCisgVGhlIERhdGEKKyBVUyBTdGF0aXN0aWNzCisgU3RhdGUgU3RhdGlzdGljcworIE1hcAorIEFib3V0CisgVHV0b3JpYWwKKyBIb3RsaW5lCisgU291cmNlIENvZGUKClRoaXMgbGF5b3V0IGVuc3VyZWQgdGhhdCB3ZSBkaWQgdG8gbm90IGluY2x1ZGUgdG9vIG1hbnkgY29tcG9uZW50cy4KClRoZSBmaXJzdCBwYWdlIGdpdmVzIHVzZXJzIHRvIHRoZSBvcHBvcnR1bml0eSB0byBsb29rIGF0IHRoZSBkYXRhIHRoZW1zZWx2ZXMuIE1vcmUgY29tcGxpY2F0ZWQgY29tcG9uZW50cyBzdWNoIGFzIHRoZSBtYXAgb2YgZWFjaCBpbmNpZGVudCB3ZXJlIGxlZnQgYWxvbmUgb24gYSBzaW5nbGUgcGFnZS4gVVMgYW5kIHN0YXRlLWxldmVsIHN0YXRpc3RpY3Mgd2VyZSBzZXBhcmF0ZWQgZnJvbSBvbmUgYW5vdGhlci4gVGhpcyBzaG9ydCB0dXRvcmlhbCBvbiBob3cgdG8gY3JlYXRlIHRoZSBkYXNoYm9hcmQgYW5kIHNvdXJjZSBjb2RlIHdlcmUgaW5jbHVkZWQgaW4gdGhlIGRhc2hib2FyZCB3aXRoIHByb2dyYW1tZXJzIGF0IGFsbCBsZXZlbHMgaW4gbWluZC4gVGhlIGdvYWxzIG9mIHRoZSBkYXNoYm9hcmQgYW5kIGFjdGlvbmFibGUgaW5mb3JtYXRpb24gd2VyZSBlYWNoIGdpdmVuIHNlcGFyYXRlIHBhZ2VzIGZyb20gdGhlIG91dHB1dC4gCgpGb3IgeW91ciBkYXNoYm9hcmQsIHRoaXMgbWF5IHRha2UgYXMgbG9uZyBhcyB0aGUgb3V0cHV0IHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRvb2sgeW91IHRvIHByb2R1Y2UuIAoKIyMjICoqNSkqKiBBZGQgY29udGVudCB0byB0aGUgZGFzaGJvYXJkLgoKWW91IGNhbiBiZWdpbiBhZGRpbmcgY29udGVudCB0byB0aGUgZGFzaGJvYXJkIG9uY2UgeW91IGhhdmUgYW4gaW5pdGlhbCBsYXlvdXQgaW4gbWluZC4gS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyB3aWxsIGxpa2VseSBiZSBhbiBpdGVyYXRpdmUgcHJvY2Vzcy4gCgpUaGUgYFJNYXJrZG93bmAgZmlsZSB1c2VkIHRvIGNyZWF0ZSBhIGRhc2hib2FyZCB3aXRoIGBmbGV4ZGFzaGJvYXJkYCB3b3JrcyBzaW1pbGFybHkgdG8gYW55IG90aGVyIGBSTWFya2Rvd25gLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zLgoKJycne3IsIGVjaG8gPSBUUlVFfQojIFRoaXMgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggY2h1bmsgb3B0aW9uczoge3IsIGVjaG8gPSBUUlVFfQpwYXN0ZSgiQ29kZSBjaHVua3MgY2FuIGJlIGV4cGxpY2l0bHkgaW5jbHVkZWQiKQonJycKCicnJ3tyfQojIFRoaXMgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggY2h1bmsgb3B0aW9uczoge3J9CnBhc3RlKCJDb2RlIGNodW5rcyBhcmUgaGlkZGVuIGJ5IGRlZmF1bHQiKQonJycKClBhZ2VzIGFuZCBjb2x1bW5zIHdpdGhpbiBwYWdlcyBjYW4gYmUgZGVmaW5lZC4KCicnJwpQYWdlCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgCgpDb2x1bW4ge2RhdGEtd2lkdGg9NTAwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpDb2x1bW4ge2RhdGEtd2lkdGg9NTAwfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicnJwoKQXMgbWVudGlvbmVkIGJlZm9yZSwgdGhlIGBmbGV4ZGFzaGJvYXJkYCBtZXRhZGF0YSBpbmNsdWRlZCBpbiB0aGUgYFlBTUxgIGRvZXMgYWxzbyBhbHRlciBob3cgYFJNYXJrZG93bmAgZnVuY3Rpb25zLiBGb3IgbW9yZSBvbiBob3cgeW91IGNhbiBsZXZlcmFnZSBib3RoIGBSTWFya2Rvd25gIGFuZCBgZmxleGRhc2hib2FyZGAgdG8gcHJvZHVjZSBhIGRhc2hib2FyZCwgY2xpY2sgW2hlcmVdKGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL2ZsZXhkYXNoYm9hcmQvaW5kZXguaHRtbCkuCgpUaGlzIFtzdXBwbGVtZW50YXJ5IHJlc291cmNlIGJ5IHRoZSBPcGVuIENhc2UgU3R1ZGllcyBwcm9qZWN0XShJTkNMVURFIExJTksgSEVSRSkgcHJvdmlkZXMgYSBjYXNlIHN0dWR5IG9uIGhvdyB0byBjcmVhdGUgdGhpcyB2ZXJ5IGRhc2hib2FyZCBpbiBtb3JlIGRldGFpbC4KYGBgCgpMYXN0bHksIHdlIGNyZWF0ZSBhICoqSG90bGluZSoqIHBhZ2UgdG8gc3ByZWFkIGF3YXJlbmVzcy4KCmBgYApIb3RsaW5lIHtkYXRhLWljb249ImZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIn0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAKCkNvbHVtbiB7ZGF0YS13aWR0aD02MDB9Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIwoKKipXYXJuaW5nIFNpZ25zKioKCkZyb20gW1NhbmR5IEhvb2sgUHJvbWlzZV0oaHR0cHM6Ly93d3cuc2FuZHlob29rcHJvbWlzZS5vcmcvZ3VuLXZpb2xlbmNlL2tub3ctdGhlLXNpZ25zLW9mLWd1bi12aW9sZW5jZS8pLi4uCgphdm9jYWRvLi4uIHRoZXJlIHdlcmUgc29tZSByZWFsbHkgaW50ZXJlc3RpbmcgdGhpbmdzIGhlcmUuLi4gYnV0IGRvbnQga25vdyB3aGVyZS9pZiB0byBpbmNsdWRlCmh0dHBzOi8vd3d3LnNhbmR5aG9va3Byb21pc2Uub3JnL2d1bi12aW9sZW5jZS8xNi1mYWN0cy1hYm91dC1ndW4tdmlvbGVuY2UtYW5kLXNjaG9vbC1zaG9vdGluZ3MvCgpUaGUgbW9zdCBpbXBvcnRhbnQgc2VlbXMgdG8gYmUgdGhhdCBzaG9vdGVycyB1c3VhbGx5IHdhcm4gc29tZW9uZQoKPHN0eWxlPgpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30KPC9zdHlsZT4KPGRpdiBjbGFzcyA9ICJibHVlIj4KCkhlcmUgaXMgYSBsaXN0IG9mIHBvdGVudGlhbCB3YXJuaW5nIHNpZ25zIHRoYXQgY2FuIHNpZ25hbCBhbiBpbmRpdmlkdWFsIG1heSBiZSBpbiBjcmlzaXMgYW5kL29yIG5lZWQgaGVscDoKCisgU3VkZGVubHkgd2l0aGRyYXdpbmcgZnJvbSBwZW9wbGUgYW5kIGFjdGl2aXRpZXMKKyBDb25zaXN0ZW50IGJ1bGx5aW5nIG9yIGludGltaWRhdGluZyBvdGhlcnMsIG9yIGJlaW5nIGJ1bGxpZWQgYnkgb3RoZXJzCisgRXh0cmVtZSBtb29kIG9yIHBlcnNvbmFsaXR5IGNoYW5nZXMKKyBWaWN0aW0gb2YgY29uc3RhbnQgc29jaWFsIHJlamVjdGlvbgorIFRhbGtpbmcgYWJvdXQgcGxhbnMgb3IgYWN0aXZlbHkgbWFraW5nIHBsYW5zIHRvIGhhcm0gdGhlbXNlbHZlcyBvciBvdGhlcnMKKyBCcmluZ2luZyBhIHdlYXBvbiB0byBzY2hvb2wg4oCTIG9yIHRocmVhdGVuaW5nIG9yIHRhbGtpbmcgYWJvdXQgZG9pbmcgc28KKyBCcmFnZ2luZyBhYm91dCBvciB3YXJuaW5nIG90aGVycyBhYm91dCBhbiB1cGNvbWluZyBhY3Qgb2YgdmlvbGVuY2UKKyBSZWNydWl0aW5nIG90aGVycyB0byBqb2luIGluIGEgcGxhbm5lZCBhY3Qgb2YgdmlvbGVuY2UKKyBXYXJuaW5nIHN0dWRlbnRzIHRvIHN0YXkgYXdheSBmcm9tIHNjaG9vbCBvciBldmVudHMKKyBFeHByZXNzaW5nIGZhc2NpbmF0aW9uIHdpdGggZ3VucyBhbmQvb3Igc2Nob29sIHNob290aW5ncworIEV4cHJlc3NpbmcgaG9wZWxlc3NuZXNzIGFib3V0IHRoZSBmdXR1cmUKKyBFeHRyZW1lLCBwcm9sb25nZWQgc2FkbmVzcyBvciBkaXN0cmVzcworIEV4cHJlc3Npbmcgb3Igc2hvd2luZyBmZWVsaW5ncyBvZiBpc29sYXRpb24KKyBCcmFnZ2luZyBhYm91dCBhY2Nlc3MgdG8gZ3VucwoKKipOT1RFKioKClRoaXMgbGlzdCBpcyBub3QgYSBjb21wcmVoZW5zaXZlIGxpc3Qgb2Ygd2FybmluZyBzaWducyBub3IgZG9lcyBleGhpYml0aW5nIG9uZSBvZiB0aGVzZSBzaWducyBpbmRpY2F0ZSBpbW1pbmVudCB2aW9sZW5jZS4KCldoZW4gY29uY2VybmVkIGFib3V0IHNlZWluZyB0cm91YmxpbmcgYmVoYXZpb3JzLCB0ZWxsIGEgdHJ1c3RlZCBhZHVsdCBvciBjYWxsIDkxMSwgaWYgdGhlcmUgaXMgYW4gaW1tZWRpYXRlIHRocmVhdC4KCjwvZGl2PgoKQ29sdW1uIHtkYXRhLXdpZHRoPTQwMH0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIAoKKipSZXNwb25kIHRvIFdhcm5pbmcgU2lnbnMqKgoKQ2FsbCA5MTEgaWYgeW91IGZlZWwgdGhlcmUgaXMgYW4gaW1tZWRpYXRlIHRocmVhdC4gCgpDYWxsIFsrMS04NDQtNS1TQVlOT1ddKHRlbDoxODQ0NTcyOTY2OSkgaWYgeW91IHdvdWxkIHRvIHN1Ym1pdCBhbiBhbm9ueW1vdXMgc2FmZXR5IGNvbmNlcm4uCmBgYAoKIyMgKipTdW1tYXJ5KioKKioqIAoKIyMjIFN1bW1hcnkgUGxvdAoKIyMjIFN5bm9wc2lzCgojIyAqKlN1Z2dlc3RlZCBIb21ld29yayoqCioqKiAKCkNyZWF0ZSBhbm90aGVyIGRhc2hib2FyZCB3aXRoIGdyYXBocyBhbmQgc3RhdGlzdGljcyBmZWF0dXJpbmcgb3RoZXIgZWxlbWVudHMgd2l0aGluIHRoaXMgZGF0YXNldC4gRm9yIGV4YW1wbGUsIHN0dWRlbnRzIG1heSBjcmVhdGUgZ3JhcGhzIHRoYXQgZXhwbG9yZSB3aGF0IHNjaG9vbCBldmVudHMgYXJlIHJlcG9ydGVkIHRvIGhhdmUgbW9yZSBzaG9vdGluZ3MuCgoKIyMgKipBZGRpdGlvbmFsIEluZm9ybWF0aW9uKioKKioqCgojIyMgSGVscGZ1bCBMaW5rcwoKW1JTdHVkaW9dKGh0dHBzOi8vcnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9mZWF0dXJlcy8pe3RhcmdldD0iX2JsYW5rIn0gIApbQ2hlYXRzaGVldCBvbiBSU3R1aWRvIElERV0oaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vY2hlYXRzaGVldHMvcmF3L21hc3Rlci9yc3R1ZGlvLWlkZS5wZGYpe3RhcmdldD0iX2JsYW5rIn0gIApbT3RoZXIgUlN0dWRpbyBjaGVhdHNoZWV0c10oaHR0cHM6Ly9yc3R1ZGlvLmNvbS9yZXNvdXJjZXMvY2hlYXRzaGVldHMvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgCltUaWR5dmVyc2VdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgCgpbUmVzcG9uc2UgYmlhc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVzcG9uc2VfYmlhcykgIApbQ3Jvc3MtU2VjdGlvbmFsIGRhdGFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nyb3NzLXNlY3Rpb25hbF9kYXRhP29sZGZvcm1hdD10cnVlKQpbUG9wdWxhdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9wdWxhdGlvbj9vbGRmb3JtYXQ9dHJ1ZSkKW1NhbXBsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2FtcGxpbmdfKHN0YXRpc3RpY3MpP29sZGZvcm1hdD10cnVlKQpbU2FtcGxpbmcgbWV0aG9kc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2FtcGxpbmdfKHN0YXRpc3RpY3MpP29sZGZvcm1hdD10cnVlKXt0YXJnZXQ9Il9ibGFuayJ9IApbSW5mZXJlbmNlXShodHRwczovL3d3dy5icml0YW5uaWNhLmNvbS9zY2llbmNlL2luZmVyZW5jZS1zdGF0aXN0aWNzKSAKCltBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IChBU0MpXShodHRwczovL3d3dy5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvYWNzKSAgCgpTZWUgW2hlcmVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FtZXJpY2FuX0NvbW11bml0eV9TdXJ2ZXkpIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXJ2ZXkgIApbTWVhc3VyZSBvZiBBbWVyaWNhXShodHRwczovL3d3dy5zc3JjLm9yZy9wcm9ncmFtcy92aWV3L21vYS8pICAgCltTb2NpYWwgU2NpZW5jZSBSZXNlYXJjaCBDb3VuY2lsXShodHRwczovL3d3dy5zc3JjLm9yZy8pIAogICAKCltQaXBpbmcgaW4gUl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21hZ3JpdHRyL3ZpZ25ldHRlcy9tYWdyaXR0ci5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICAgCltXcml0aW5nIGZ1bmN0aW9uc10oaHR0cHM6Ly9yNGRzLmhhZC5jby5uei9mdW5jdGlvbnMuaHRtbCkgICAKQWxzbyBzZWUgW3RoaXMgY2FzZSBzdHVkeV0oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvL29jcy1ibG9vbWJlcmctdmFwaW5nLWNhc2Utc3R1ZHkvKXt0YXJnZXQ9Il9ibGFuayJ9ICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIGZ1bmN0aW9ucy4gICAKW1N0cmluZyBtYW5pcHVsYXRpb24gY2hlYXRzaGVldF0oaHR0cHM6Ly9yc3R1ZGlvLmNvbS9yZXNvdXJjZXMvY2hlYXRzaGVldHMvKXt0YXJnZXQ9Il9ibGFuayJ9ICAKW1RhYmxlIGZvcm1hdHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpZGVfYW5kX25hcnJvd19kYXRhKXt0YXJnZXQ9Il9ibGFuayJ9CgpbUmVncmVzc2lvbl0oaHR0cHM6Ly9saW5kZWxvZXYuZ2l0aHViLmlvL3Rlc3RzLWFzLWxpbmVhci8pICAgIApbc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaW1wbGVfbGluZWFyX3JlZ3Jlc3Npb24pICAgClttb25vdG9uaWMgYXNzb2NpYXRpb25dKGh0dHBzOi8vd3d3LnN0YXRpc3RpY3Nob3d0by5jb20vbW9ub3RvbmljLXJlbGF0aW9uc2hpcC8pICAgCltLZW5kYWxsIHJhbmsgY29ycmVsYXRpb24gY29lZmZpY2llbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0tlbmRhbGxfcmFua19jb3JyZWxhdGlvbl9jb2VmZmljaWVudD9vbGRmb3JtYXQ9dHJ1ZSkgICAKW051bGwgaHlwb3RoZXNpc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTnVsbF9oeXBvdGhlc2lzKSAgIApbQWx0ZXJuYXRpdmUgaHlwb3RoZXNpc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWx0ZXJuYXRpdmVfaHlwb3RoZXNpcykgICAKW1Byb2JhYmlsaXR5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qcm9iYWJpbGl0eSkgICAKW29uZS1zaWRlZCBhbmQgdHdvLXNpZGVkIGh5cG90aGVzZXNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09uZS1fYW5kX3R3by10YWlsZWRfdGVzdHMpICAgCltOb25wYXJhbWV0cmljXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ob25wYXJhbWV0cmljX3N0YXRpc3RpY3MpICAgICBbUGFyYW1ldHJpY10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFyYW1ldHJpY19zdGF0aXN0aWNzKSAKW3NpZ25pZmljYW5jZSB0aHJlc2hvbGRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N0YXRpc3RpY2FsX3NpZ25pZmljYW5jZSkgIApbWiBzY29yZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3RhbmRhcmRfc2NvcmUpICAgCltaIHNjb3JlIHRhYmxlXShodHRwczovL3NvY3JhdGljLm9yZy9xdWVzdGlvbnMvNTk4NmEzZTFiNzJjZmY2ZmQ0OGE1NDA4KSAgCltaIHNjb3JlIHRvIHAtdmFsdWUgY2FsY3VsYXRvcl0oaHR0cHM6Ly93d3cuc29jc2Npc3RhdGlzdGljcy5jb20vcHZhbHVlcy9ub3JtYWxkaXN0cmlidXRpb24uYXNweCkgICAKCgpbYGdncGxvdDJgIHBhY2thZ2VdKGh0dHA6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcpe3RhcmdldD0iX2JsYW5rIn0gICAgClBsZWFzZSBzZWUgW3RoaXMgY2FzZSBzdHVkeV0oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvL29jcy1icC1jbzItZW1pc3Npb25zLykgIGZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgYGdncGxvdDJgICAgIApbZ3JhbW1hciBvZiBncmFwaGljc10oaHR0cDovL3ZpdGEuaGFkLmNvLm56L3BhcGVycy9sYXllcmVkLWdyYW1tYXIuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSAgIApbYGdncGxvdDJgIHRoZW1lc10oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2dndGhlbWUuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSAgIApbYGRpcmVjdGxhYmVsc2AgcGFja2FnZSBtZXRob2RzXShodHRwOi8vZGlyZWN0bGFiZWxzLnItZm9yZ2Uuci1wcm9qZWN0Lm9yZy9kb2NzL2luZGV4Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gICAgCltIbW9uZyBwZW9wbGVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0htb25nX3Blb3BsZSkgICAKW0ludGVyc2VjdGlvbnNdKGh0dHBzOi8vd3d3LnZveC5jb20vdGhlLWhpZ2hsaWdodC8yMDE5LzUvMjAvMTg1NDI4NDMvaW50ZXJzZWN0aW9uYWxpdHktY29uc2VydmF0aXNtLWxhdy1yYWNlLWdlbmRlci1kaXNjcmltaW5hdGlvbikgICAKCltNb3RpdmF0aW5nIGFydGljbGUgZm9yIHRoaXMgY2FzZSBzdHVkeSBhYm91dCB5b3V0aCBkaXNjb25uZWN0aW9uL29wcG9ydHVuaXR5IHlvdXRoXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BtYy9hcnRpY2xlcy9QTUM2MjQzNDQ2LykKCgpUbyBsZWFybiBtb3JlIGFib3V0IGltcG9ydGluZyBhbmQgd3JhbmdsaW5nIFBERnMgdXNpbmcgdGhlIGBwZGZ0b29sc2AgcGFja2FnZSBzZWUgdGhpcyBbY2FzZSBzdHVkeV0oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvL29jcy1icC1ydXJhbC1hbmQtdXJiYW4tb2Jlc2l0eS8pIGFuZCB0aGlzIFtjYXNlIHN0dWR5XShodHRwczovL29wZW5jYXNlc3R1ZGllcy5naXRodWIuaW8vb2NzLWJwLXJ1cmFsLWFuZC11cmJhbi1vYmVzaXR5LykuIAoKVG8gbGVhcm4gbW9yZSBhYm91dCB3aGF0IHlvdSBjYW4gZG8gd2l0aCB0aGUgYG1hZ2lja2AgcGFja2FnZSBzZWUgdGhpcyBbdmluZ2V0dGVdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9tYWdpY2svdmlnbmV0dGVzL2ludHJvLmh0bWwpLiAgIAoKVG8gbGVhcm4gbW9yZSBhYm91dCB0aGUgKipNYW5uLUtlbmRhbGwgdHJlbmQgdGVzdCoqIHNlZQpbaGVyZV0oaHR0cHM6Ly93d3cuc3RhdGlzdGljc2hvd3RvLmNvbS9tYW5uLWtlbmRhbGwtdHJlbmQtdGVzdC8pIGFuZCBbaGVyZV0oaHR0cHM6Ly93d3cuc3RhdGlzdGljc2hvd3RvLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNi8wOC9NYW5uLUtlbmRhbGwtQW5hbHlzaXMtMS5wZGYpLiAgCgpUbyBsZWFybiBtb3JlIGFib3V0IGh5cG90aGVzaXMgdGVzdGluZywgc2VlIHRoaXMgW2Nhc2Ugc3R1ZHldKGh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pby9vY3MtYnAtcnVyYWwtYW5kLXVyYmFuLW9iZXNpdHkvKS4gICAgCgoKPHU+KipQYWNrYWdlcyB1c2VkIGluIHRoaXMgY2FzZSBzdHVkeToqKiA8L3U+CgpQYWNrYWdlICAgfCBVc2UgaW4gdGhpcyBjYXNlIHN0dWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tCltoZXJlXShodHRwczovL2dpdGh1Yi5jb20vamVubnliYy9oZXJlX2hlcmUpe3RhcmdldD0iX2JsYW5rIn0gICAgICAgfCB0byBlYXNpbHkgbG9hZCBhbmQgc2F2ZSBkYXRhICAKW3BkZnRvb2xzXShodHRwczovL3JlYWRyLnRpZHl2ZXJzZS5vcmcvKSAgICAgIHwgdG8gaW1wb3J0IFBERiBkb2N1bWVudHMgIApbbWFnaWNrXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvbWFnaWNrL3ZpZ25ldHRlcy9pbnRyby5odG1sI0tlcm5lbF9jb252b2x1dGlvbikgICAgICB8IGZvciBpbXBvcnRpbmcgaW1hZ2VzIGFuZCBleHRyYWN0aW5nIHRleHQgZnJvbSBpbWFnZXMgICAKW2tuaXRyXShodHRwczovL3lpaHVpLm9yZy9rbml0ci8pIHwgIGZvciBzaG93aW5nIGltYWdlcyBpbiByZXBvcnRzICAgIApbZHBseXJdKGh0dHBzOi8vZHBseXIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGZpbHRlciwgc3Vic2V0LCBqb2luLCBhZGQgcm93cyB0bywgYW5kIG1vZGlmeSB0aGUgZGF0YSAgIApbc3RyaW5ncl0oaHR0cHM6Ly9zdHJpbmdyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBtYW5pcHVsYXRlIHN0cmluZ3MgIApbbWFncml0dHJdKGh0dHBzOi8vbWFncml0dHIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIHBpcGUgc2VxdWVudGlhbCBjb21tYW5kcyAKW3RpZHlyXShodHRwczovL3RpZHlyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBjaGFuZ2UgdGhlIHNoYXBlIG9yIGZvcm1hdCBvZiB0aWJibGVzIHRvIHdpZGUgYW5kIGxvbmcsIHRvIGRyb3Agcm93cyB3aXRoIGBOQWAgdmFsdWVzLCB0byBzZXBhcmF0ZSBhIGNvbHVtbiBpbnRvIGFkZGl0aW9uYWwgY29sdW1ucywgYW5kIHRvIGZpbGwgb3V0IHZhbHVlcyBiYXNlZCBvbiBwcmV2aW91cyB2YWx1ZXMgICAKW3RpYmJsZV0oaHR0cHM6Ly90aWJibGUudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGNyZWF0ZSB0aWJibGVzICAgIApbZ2dwbG90Ml0oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBjcmVhdGUgcGxvdHMgIApbZGlyZWN0bGFiZWxzXShodHRwOi8vZGlyZWN0bGFiZWxzLnItZm9yZ2Uuci1wcm9qZWN0Lm9yZy9kb2NzL2luZGV4Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGFkZCBsYWJlbHMgZGlyZWN0bHkgdG8gbGluZXMgaW4gcGxvdHMgIApbY293cGxvdF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2Nvd3Bsb3QvdmlnbmV0dGVzL2ludHJvZHVjdGlvbi5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBhZGQgaW1hZ2VzIHRvIHBsb3RzIApbZm9yY2F0c10oaHR0cHM6Ly9mb3JjYXRzLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byByZW9yZGVyIGZhY3RvciBmb3IgcGxvdApba2VuZGFsbF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL0tlbmRhbGwvS2VuZGFsbC5wZGYpIHwgdG8gaW1wbGVtZW50IHRoZSBNYW5uLUtlbmRhbGwgdHJlbmQgdGVzdCBpbiBSICAgCltwYXRjaHdvcmtdKGh0dHBzOi8vZ2l0aHViLmNvbS90aG9tYXNwODUvcGF0Y2h3b3JrKSB8IHRvIGNvbWJpbmUgcGxvdHMKCiMjIyMgey5lbXBoYXNpc19ibG9ja30KCioqV2FybmluZyBTaWducyoqCgpGcm9tIFtTYW5keSBIb29rIFByb21pc2VdKGh0dHBzOi8vd3d3LnNhbmR5aG9va3Byb21pc2Uub3JnL2d1bi12aW9sZW5jZS9rbm93LXRoZS1zaWducy1vZi1ndW4tdmlvbGVuY2UvKS4uLgoKSGVyZSBpcyBhIGxpc3Qgb2YgcG90ZW50aWFsIHdhcm5pbmcgc2lnbnMgdGhhdCBjYW4gc2lnbmFsIGFuIGluZGl2aWR1YWwgbWF5IGJlIGluIGNyaXNpcyBhbmQvb3IgbmVlZCBoZWxwOgoKKyBTdWRkZW5seSB3aXRoZHJhd2luZyBmcm9tIHBlb3BsZSBhbmQgYWN0aXZpdGllcworIENvbnNpc3RlbnQgYnVsbHlpbmcgb3IgaW50aW1pZGF0aW5nIG90aGVycywgb3IgYmVpbmcgYnVsbGllZCBieSBvdGhlcnMKKyBFeHRyZW1lIG1vb2Qgb3IgcGVyc29uYWxpdHkgY2hhbmdlcworIFZpY3RpbSBvZiBjb25zdGFudCBzb2NpYWwgcmVqZWN0aW9uCisgVGFsa2luZyBhYm91dCBwbGFucyBvciBhY3RpdmVseSBtYWtpbmcgcGxhbnMgdG8gaGFybSB0aGVtc2VsdmVzIG9yIG90aGVycworIEJyaW5naW5nIGEgd2VhcG9uIHRvIHNjaG9vbCDigJMgb3IgdGhyZWF0ZW5pbmcgb3IgdGFsa2luZyBhYm91dCBkb2luZyBzbworIEJyYWdnaW5nIGFib3V0IG9yIHdhcm5pbmcgb3RoZXJzIGFib3V0IGFuIHVwY29taW5nIGFjdCBvZiB2aW9sZW5jZQorIFJlY3J1aXRpbmcgb3RoZXJzIHRvIGpvaW4gaW4gYSBwbGFubmVkIGFjdCBvZiB2aW9sZW5jZQorIFdhcm5pbmcgc3R1ZGVudHMgdG8gc3RheSBhd2F5IGZyb20gc2Nob29sIG9yIGV2ZW50cworIEV4cHJlc3NpbmcgZmFzY2luYXRpb24gd2l0aCBndW5zIGFuZC9vciBzY2hvb2wgc2hvb3RpbmdzCisgRXhwcmVzc2luZyBob3BlbGVzc25lc3MgYWJvdXQgdGhlIGZ1dHVyZQorIEV4dHJlbWUsIHByb2xvbmdlZCBzYWRuZXNzIG9yIGRpc3RyZXNzCisgRXhwcmVzc2luZyBvciBzaG93aW5nIGZlZWxpbmdzIG9mIGlzb2xhdGlvbgorIEJyYWdnaW5nIGFib3V0IGFjY2VzcyB0byBndW5zCgoqKk5PVEUqKgoKVGhpcyBsaXN0IGlzIG5vdCBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiB3YXJuaW5nIHNpZ25zIG5vciBkb2VzIGV4aGliaXRpbmcgb25lIG9mIHRoZXNlIHNpZ25zIGluZGljYXRlIGltbWluZW50IHZpb2xlbmNlLgoKV2hlbiBjb25jZXJuZWQgYWJvdXQgc2VlaW5nIHRyb3VibGluZyBiZWhhdmlvcnMsIHRlbGwgYSB0cnVzdGVkIGFkdWx0IG9yIGNhbGwgOTExLCBpZiB0aGVyZSBpcyBhbiBpbW1lZGlhdGUgdGhyZWF0LgoKKipSZXNwb25kIHRvIFdhcm5pbmcgU2lnbnMqKgoKQ2FsbCA5MTEgaWYgeW91IGZlZWwgdGhlcmUgaXMgYW4gaW1tZWRpYXRlIHRocmVhdC4gCgpDYWxsIFsrMS04NDQtNS1TQVlOT1ddKHRlbDoxODQ0NTcyOTY2OSkgaWYgeW91IHdvdWxkIHRvIHN1Ym1pdCBhbiBhbm9ueW1vdXMgc2FmZXR5IGNvbmNlcm4uCgoKSWYgeW91IG9yIHlvdXIgY2hpbGQgb3Igc3R1ZGVudCBleHBlcmllbmNlZCBhIHNob290aW5nIHBsZWFzZSBzZWUgdGhpcyBbd2Vic2l0ZV0oaHR0cHM6Ly9raWRzaGVhbHRoLm9yZy9lbi9wYXJlbnRzL3B0c2QuaHRtbCkgYW5kIHRoaXMgW3dlYnNpdGVdKGh0dHBzOi8vd3d3LnZlcnl3ZWxsbWluZC5jb20vc2hvb3RpbmctcHRzZC1mcm9tLWEtc2hvb3RpbmctMjc5NzIwMCkgZm9yIGd1aWRhbmNlIGFib3V0IGRlYWxpbmcgd2l0aCB0aGUgdHJhdW1hLgoKCiMjIyMKCiMjIyBTZXNzaW9uIEluZm8KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoKCiMjIyBBY2tub3dsZWRnZW1lbnRzCgpXZSB3b3VsZCBsaWtlIHRvIGFja25vd2xlZGdlIFtFbGl6YWJldGggU3R1YXJ0XShodHRwczovL3d3dy5qaHNwaC5lZHUvZmFjdWx0eS9kaXJlY3RvcnkvcHJvZmlsZS8xNzkyL2VsaXphYmV0aC1hLXN0dWFydCkgZm9yIGFzc2lzdGluZyBpbiBmcmFtaW5nIHRoZSBtYWpvciBkaXJlY3Rpb24gb2YgdGhlIGNhc2Ugc3R1ZHkuCgpXZSB3b3VsZCBhbHNvIGxpa2UgdG8gYWNrbm93bGVkZ2UgdGhlIFtCbG9vbWJlcmcgQW1lcmljYW4gSGVhbHRoIEluaXRpYXRpdmVdKGh0dHBzOi8vYW1lcmljYW5oZWFsdGguamh1LmVkdS8pIGZvciBmdW5kaW5nIHRoaXMgd29yay4gCgo=